从Java接口实现Kotlin属性

q7solyqu  于 2023-02-13  发布在  Kotlin
关注(0)|答案(1)|浏览(133)

请考虑以下Java接口

interface Foo {
    String getValue();
}

在Kotlin中,get/set函数被转换为属性,所以我希望实现如下所示

class FooImpl : Foo {
    val value: String get() = "Hello, World!"
}

但实际上我必须实现接口中的方法

class FooImpl {
    override fun getValue(): String {
        return "Hello, World!";
    }
}

为什么?

lyr7nygr

lyr7nygr1#

Kotlin对方法和属性做了明确的区分,它们不被认为是一回事;因为JVM本身并不支持属性,所以最后两者都被编译成了方法,这样一来,一个方法就不能实现一个属性,因为它们根本不同。
不能用属性实现Java getter的原因与不能用override val x: String实现Kotlin定义的fun getX(): String的原因是一样的;它们就是不兼容。
这里的困惑似乎源于Kotlin如何允许您使用类似属性的语法访问Java getter,即如果类是用Java定义的,则val foo = obj.x等价于val foo = obj.getX()
这是一种严格的单向关系,它使与Java代码互操作的Kotlin代码稍微更紧凑和“类似Kotlin”;这个语法上的快捷方式并没有扩展到将方法当作属性来 * 实现 *。
另外,如果你将一个方法实现为一个属性,那可能会导致奇怪的效果。可以说,它将同时是一个方法和一个属性,这不仅是奇怪的,而且可能会导致语言中许多其他意想不到的行为和边缘情况。(例如,当使用反射时,它将如何处理?)

相关问题