考虑以下 Java 接口
interface Foo {
String getValue();
}
Run Code Online (Sandbox Code Playgroud)
在 Kotlin 中,get/set 函数被转换为属性,所以我希望实现如下所示
class FooImpl : Foo {
val value: String get() = "Hello, World!"
}
Run Code Online (Sandbox Code Playgroud)
但我实际上必须实现接口中的方法
class FooImpl {
override fun getValue(): String {
return "Hello, World!";
}
}
Run Code Online (Sandbox Code Playgroud)
为什么?
Kotlin 对方法和属性做出了明确的区分。它们不被视为同一事物;碰巧的是,由于 JVM 本身并不支持属性,因此两者最终都被编译为方法。因此,方法无法实现属性,因为它们根本不同。
无法使用属性实现 Java getter 的原因与无法使用 ; 实现 Kotlin 定义的原因fun getX(): String相同override val x: String。他们只是不兼容。
这里的混乱似乎源于 Kotlin 如何允许您使用类似属性的语法访问 Java getter,即val foo = obj.x相当于val foo = obj.getX()类是在 Java 中定义的。
这严格来说是一种单向关系,以使与 Java 代码互操作的 Kotlin 代码稍微更加紧凑并且“类似 Kotlin”;这个语法快捷方式不会扩展到实现该方法,就好像它是一个属性一样。
此外,如果您将方法实现为属性,则可能会导致奇怪的效果。可以说,它同时是一个方法和一个属性,这不仅很奇怪,而且可能会导致语言中的许多其他意外行为和边缘情况。(例如,使用反射时会如何处理?)
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |