重新访问Kotlin 1.0.1之前的版本中的某些代码,看来我的扩展属性不再起作用。实际上,它仍然可以,但是我不能再覆盖它了。
考虑此类:
class TestClass {
override val loggerName: String
get() = "A new name"
fun aMethod() {
info("test info message")
}
}
如果您具有以下扩展名,则在Kotlin 1.0.1之前的版本可以使用:
val Any.loggerName: String
get() = javaClass.simpleName!!
fun Any.info(message: String) {
//...
}
默认情况下,loggerName将采用相关实例的类名。当前,在这种情况下,loggerName已正确分配给 TestClass ,但是我无法覆盖它。
这是新版本的Kotlin中的意外错误还是新限制?我搜索了Kotlin - Extensions,但发现它应该可以工作。
技术人员:
我正在使用Kotlin插件版本1.0.1-release-IJ143-32在IntelliJ IDEA 2016.1中对此进行测试。
编辑1:
TestClass甚至无法识别此属性,但是在访问TestClass的实例(例如
instanceOfTestClass.loggerName
)时,它会被识别。
最佳答案
在Kotlin的任何预发行版本中,都不可能使用类的属性来覆盖扩展属性,在1.0.1中也不可能。扩展属性被编译为静态方法,访问扩展属性的代码只是调用静态方法。不可能根据接收者的类型执行动态分配。
没有覆盖,extension属性将起作用。您需要确保已将其导入到尝试访问它的位置。
关于kotlin - V1.0.1中无法识别的Kotlin扩展属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36191305/