在V1.0.1中不能识别Kotlin扩展属性

重新访问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被正确地分配给TestClass ,但是我不能覆盖它。

这是Kotlin新版本中的一个意外错误还是一个新的限制? 我已经搜索Kotlin – 扩展,但只发现它应该工作。

技术

我正在使用Kotlin插件版本1.0.1-release-IJ143-32在IntelliJ IDEA 2016.1中进行测试。

编辑1:

TestClass甚至不能识别这个属性,但是当访问TestClass的一个实例(例如: instanceOfTestClass.loggerName )时,它是被识别的。

在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版本替换$kotlin_version

注意:如果您使用的是Android Studio 2.0 Preview ,那么在插件中会出现一些堰塞的行为,在某些情况下也会停止工作,所以现在建议您使用1.5版本,因为它的工作方式和预期的一样。

请参阅使用Kotlin配置Android Studio

希望它能帮助你。