【问题标题】:Variables shadowing in Kotlin for inner classes: how variables are resolved?Kotlin 中内部类的变量阴影:如何解析变量?
【发布时间】:2020-12-29 13:28:09
【问题描述】:

我在 Kotlin 中有以下代码 sn-p。我喜欢这样的代码难题,但这里的结果对我来说太出乎意料了。谁能描述我为什么它打印1 而不是2

由于 Java 中禁止使用阴影 - 看起来我完全不明白它在 Kotlin 中是如何工作的。

fun main() {
    var a = 1
    class A {
        var a = 2

        fun foo() = a
    }

    println(A().foo())
}

===========奖金============

有趣的是,当您在类声明之后移动var a = 1 时,以下代码可以正常工作并打印2

fun main() {
    
    class A {
        var a = 2

        fun foo() = a
    }

    var a = 1
    println(A().foo())
}

UPD:看起来 Kotlin 突然决定像 C++ 一样玩并且有未定义的行为:D

来自Kotlin specuse this with caution, because in some cases it can be called instead

【问题讨论】:

  • 对于奖金,我认为您的意思是打印2,而不是1

标签: java kotlin shadowing


【解决方案1】:

当您在class A 中执行var a = 2 时,实际上并没有隐藏任何变量。您声明aA 类的字段,默认为2。

当你在一个类前面引用一个变量时,如果有一个具有该名称的字段但不是上层变量,Kotlin 将添加一个隐式的this(例如a 变为this.a)用那个名字。因此,外部a 优先于字段,您必须使用this.a 才能访问内部a

【讨论】:

  • 这让我有点意外。我正在尝试查找记录此行为的位置,但无法找到它。你有没有发现它写在任何地方?
  • 哈哈,我喜欢规范中的这句话:“谨慎使用,因为在某些情况下可以调用它”。非常令人惊讶,并且看起来是规范中的某种差距:)
猜你喜欢
  • 2012-09-03
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多