V1.0.1

时间:2016-03-24 00:40:57

标签: kotlin kotlin-extension

重新访问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),它被识别出来。

2 个答案:

答案 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

希望它可以帮助你。