- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我遇到了@JvmSynthetic
kotlin-stdlib 中的注释,我想知道它的用途,但不幸的是,它没有记录。 (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 中,synthetic
方法由 javac
编译器生成。通常,当封闭类访问使用 private 修饰符指定的字段时,编译器必须在嵌套类上创建合成方法。
给定java中的以下类:
public final class SyntheticSample
{
public static void main(final String[] args)
{
SyntheticSample.Nested nested = new SyntheticSample.Nested();
out.println("String: " + nested.syntheticString);
}
private static final class Nested
{
private String syntheticString = "I'll become a method!";
}
}
当SyntheticSample
类访问nested.syntheticString
字段时,确实是在调用编译器生成的静态synthetic
方法(命名为比如access$100
)。
即使 Kotlin 公开了一个能够“强制”创建合成方法的 @JvmSynthetic
注释,我还是建议不要在普通的“用户”代码中使用它。合成方法是编译器制作的低级技巧,我们不应该在日常代码中依赖这些东西。我认为它可以支持标准库的其他部分,但如果您有兴趣,请直接询问 JetBrains 人员(尝试官方 Kotlin Discussion Forum)
关于java - @JvmSynthetic 在 Kotlin 中的预期用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41022275/
我遇到了@JvmSynthetic kotlin-stdlib 中的注释,我想知道它的用途,但不幸的是,它没有记录。 (UPD:就在那一刻) 据我了解,将其应用于程序元素会将 synthetic 修饰
在 Kotlin 中,当我有一个非公共(public)成员和一个调用它的 inline fun 时,会出现编译错误: Error:(22, 25) Kotlin: Public-API inline
我是一名优秀的程序员,十分优秀!