【发布时间】:2017-04-22 16:20:10
【问题描述】:
我在 kotlin-stdlib 中遇到了 @JvmSynthetic 注释,我想知道它的用途,但不幸的是,它没有记录。 (UPD:就在那一刻)
据我了解,将其应用于程序元素会将synthetic 修饰符添加到相应的字节码元素中。结果,该元素在 Java 中变得不可见:
class MyClass {
@JvmSynthetic
fun f() { }
}
Java 代码中的某处:
MyClass c = new MyClass();
c.f() // Error: cannot resolve method f()
但在 Kotlin 代码中仍然可以看到相同的元素:
val c = MyClass()
c.f() // OK
隐藏来自非 Kotlin 来源的声明是否是 @JvmSynthetic 的有效使用?是预期用途吗?其他合适的用例是什么?
由于@JvmSynthetic 隐藏了Java 中的函数,它们也不能在Java 中被覆盖(当涉及abstract 成员时,调用会导致AbstractMethodError)。鉴于此,我可以使用@JvmSynthetic 来禁止在 Java 源代码中覆盖 Kotlin 类的成员吗?
【问题讨论】:
-
我用它来隐藏 Java 的声明,尤其是那些
@PublishedApi internal,即。 e.可在内联函数中访问。
标签: java kotlin java-interop synthetic