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

希望对你有帮助。