请考虑以下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!";
}
}
为什么?
1条答案
按热度按时间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”;这个语法上的快捷方式并没有扩展到将方法当作属性来 * 实现 *。
另外,如果你将一个方法实现为一个属性,那可能会导致奇怪的效果。可以说,它将同时是一个方法和一个属性,这不仅是奇怪的,而且可能会导致语言中许多其他意想不到的行为和边缘情况。(例如,当使用反射时,它将如何处理?)