1

重新访问 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它会被识别。

4

2 回答 2

3

在 Kotlin 的任何预发布版本中,都不可能用类的属性覆盖扩展属性,在 1.0.1 中也不可能。扩展属性被编译成静态方法,访问扩展属性的代码只是调用静态方法;不可能根据接收者的类型执行动态调度。

如果没有覆盖,扩展属性将起作用。您需要确保已将其导入到您尝试访问它的位置。

于 2016-03-24T04:02:24.660 回答
0

Make sure your gradle look like below :

 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"
    }
}

Replace $kotlin_version with your kotlin version.

Note: If you are using Android Studio 2.0 Preview, expect some weir behaviours in the Plugin, also in some situations it stop working, so for now suggest you to use 1.5 version as it’s working as expected.

See Configuring Android Studio with Kotlin

hope its helps you.

于 2016-03-24T04:20:39.023 回答