V1.0.1 无法识别 Kotlin 扩展属性
Kotlin extension properties not recognized in V1.0.1
重新访问 Kotlin 1.0.1 之前版本的一些代码,我的扩展 属性 似乎不再有效。事实上,它仍然可以,但我不能再覆盖它。
考虑这个 class:
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 默认采用相关实例的 class 名称。目前,在这种情况下,loggerName 已正确分配给 TestClass,但我无法覆盖它。
这是新版本 Kotlin 的意外错误还是新限制?我搜索了 Kotlin - Extensions 但只发现它应该有效。
技术:
我正在使用 Kotlin 插件版本 1.0.1-release-IJ143-32 在 IntelliJ IDEA 2016.1 中对此进行测试。
编辑 1:
TestClass 甚至不识别此 属性 但是在访问 TestClass 的实例(示例:instanceOfTestClass.loggerName
)时它被识别。
用 class 的 属性 覆盖扩展名 属性 在 Kotlin 的任何预发布版本中都是不可能的,在 1.0.1 中也是不可能的。扩展属性被编译为静态方法,访问扩展属性的代码只是调用静态方法;无法根据接收者的类型执行动态调度。
没有覆盖,扩展 属性 将起作用。您需要确保已将其导入到您尝试访问它的地方。
确保您的 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 Preview,请期待一些 weir 插件中的行为,在某些情况下它 stop 工作,所以现在建议您使用 1.5 版本,因为它按预期工作.
见Configuring Android Studio with Kotlin
希望对你有帮助。
重新访问 Kotlin 1.0.1 之前版本的一些代码,我的扩展 属性 似乎不再有效。事实上,它仍然可以,但我不能再覆盖它。
考虑这个 class:
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 默认采用相关实例的 class 名称。目前,在这种情况下,loggerName 已正确分配给 TestClass,但我无法覆盖它。
这是新版本 Kotlin 的意外错误还是新限制?我搜索了 Kotlin - Extensions 但只发现它应该有效。
技术:
我正在使用 Kotlin 插件版本 1.0.1-release-IJ143-32 在 IntelliJ IDEA 2016.1 中对此进行测试。
编辑 1:
TestClass 甚至不识别此 属性 但是在访问 TestClass 的实例(示例:instanceOfTestClass.loggerName
)时它被识别。
用 class 的 属性 覆盖扩展名 属性 在 Kotlin 的任何预发布版本中都是不可能的,在 1.0.1 中也是不可能的。扩展属性被编译为静态方法,访问扩展属性的代码只是调用静态方法;无法根据接收者的类型执行动态调度。
没有覆盖,扩展 属性 将起作用。您需要确保已将其导入到您尝试访问它的地方。
确保您的 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 Preview,请期待一些 weir 插件中的行为,在某些情况下它 stop 工作,所以现在建议您使用 1.5 版本,因为它按预期工作.
见Configuring Android Studio with Kotlin
希望对你有帮助。