我注意到以下Kotlin代码编译并成功执行:
for (i in 1..2) {
val i = "a"
print(i)
}
这会打印aa
。但是,我没有找到允许这种变量阴影的决定背后的理由。我会说这不是一个好习惯,即使在Java中也是禁止的。
我认为Kotlin设计师在改进Java语法方面做了很多工作,并将其融入日常实际应用中,所以我必须在这里遗漏一些东西?
答案 0 :(得分:10)
Kotlin不会以任何方式限制变量阴影。理由很简单:" 一致性。"
由于你可以在大多数其他地方隐藏变量,为什么你只从允许的选项中排除一些循环变量?他们为什么这么特别?这是一种随意的差异。
任何范围都可以遮蔽另一个范围中使用的变量。它是 NOT 良好做法,并且确实产生了编译器警告 - 但它是允许的。
如果您想与项目的贡献者进行对话,请尝试讨论论坛或冗余频道,两者都是从Kotlin Community page链接的。否则,如果您觉得它是一个错误,请向Kotlin YouTrack添加一个问题报告,您收到的答案也将是明确的。
与此同时,您可以自由编写无意义的代码,例如:
val i = 1
class Foo() {
val i = "monkey"
init { println(i) }
@Test fun boo() {
println(i)
val i = i.length
println(i)
if (i == 6) {
val i = Date(System.currentTimeMillis() + i) // Shadow warning
println(i)
}
for (i in 0..i) { // Shadow warning
val i = "chimp $i" // Shadow warning
println(i)
}
InnerFoo()
}
class InnerFoo() {
val i: Long = 100L
init { println(i) }
}
}
在Kotlin 1.0.3中产生3个警告。
警告:(15,21)Kotlin:名字被遮蔽:i 警告:(18,18)Kotlin:名字阴影:我
警告:(19,21)Kotlin:名字阴影:我
输出:
猴子猴子6 6周日7月17日11:31:23 UYT 2016
黑猩猩0
黑猩猩1
黑猩猩2
黑猩猩3
黑猩猩4
黑猩猩5
黑猩猩6
100