重新访问Kotlin的1.0.1之前版本的一些代码,看来我的扩展属性不再有效。事实上,它仍然存在,但我不能再覆盖它。
考虑这个课程:
class TestClass {
override val loggerName: String
get() = "A new name"
fun aMethod() {
info("test info message")
}
}
Pre Kotlin 1.0.1如果您有以下扩展名,这将有效:
val Any.loggerName: String
get() = javaClass.simpleName!!
fun Any.info(message: String) {
//...
}
loggerName默认采用相关实例的类名。目前,在这种情况下,loggerName已正确分配给<strong> TestClass ,但我无法覆盖它。
这是Kotlin新版本中的偶然错误还是新限制?我搜索了Kotlin - Extensions,但发现它只能起作用。
技术指标:
我在IntelliJ IDEA 2016.1中使用Kotlin插件版本1.0.1-release-IJ143-32进行测试。
编辑1:
TestClass甚至不识别这个属性,但是当访问TestClass的一个实例时(例如:instanceOfTestClass.loggerName
),它被识别出来。
答案 0 :(得分:3)
在任何预发布版本的Kotlin中都无法覆盖具有类属性的扩展属性,也不可能在1.0.1中。扩展属性被编译为静态方法,访问扩展属性的代码只是调用静态方法;根据接收器的类型,不可能进行动态调度。
没有覆盖,扩展属性将起作用。您需要确保已在尝试访问它的位置导入它。
答案 1 :(得分:0)
确保您的gradle
如下所示:
apply plugin: 'kotlin-android'
...
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
...
dependencies {
...
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
...
buildscript {
ext.kotlin_version = '1.0.0-XYZ'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
将$kotlin_version
替换为您的kotlin版本。
注意:如果您使用 Android Studio 2.0预览,请在插件中预期一些 weir 行为,在某些情况下 停止工作,所以现在建议您使用 1.5 版本,因为它正在按预期工作。
请参阅Configuring Android Studio with Kotlin
希望它可以帮助你。