我在Kotlin有以下方法:
inline fun <reified T> foo() {
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试从Java调用这样:
myObject.foo();
Run Code Online (Sandbox Code Playgroud)
或者像这样:
myObject.<SomeClass>foo();
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
java:foo()在MyClass中具有私有访问权限
如何foo从Java 调用该方法?
我@JvmSynthetic在kotlin-stdlib中遇到了注释,我想知道它是什么,但不幸的是,它没有记录.
据我所知,将它应用于程序元素会将synthetic修饰符添加到相应的字节码元素.结果,该元素从Java变得不可见:
class MyClass {
@JvmSynthetic
fun f() { }
}
Run Code Online (Sandbox Code Playgroud)
Java代码中的某处:
MyClass c = new MyClass();
c.f() // Error: cannot resolve method f()
Run Code Online (Sandbox Code Playgroud)
但是在Kotlin代码中仍然可以看到相同的元素:
val c = MyClass()
c.f() // OK
Run Code Online (Sandbox Code Playgroud)
隐藏来自非Kotlin来源的声明是否有效使用@JvmSynthetic?它是预期用途吗?其他适当的用例是什么?
由于@JvmSynthetic隐藏了来自Java的函数,它们也无法在Java中被覆盖(当涉及abstract成员时,调用会产生AbstractMethodError).鉴于此,我可以@JvmSynthetic用来禁止在Java源代码中覆盖Kotlin类的成员吗?
考虑这个非扩展函数:
fun checkArguments(expression: Boolean) {
if (!expression) {
throw IllegalArgumentException()
}
}
Run Code Online (Sandbox Code Playgroud)
当我在kotlin和java中使用这个函数时,我可以看到它的参数名称:expression。
我还可以将相同的功能编写为扩展函数:
fun Boolean.checkArguments() {
if (!this) {
throw IllegalArgumentException()
}
}
Run Code Online (Sandbox Code Playgroud)
当我以这种方式将其编写为扩展函数时,调用它的布尔值的参数名称(this函数内的变量,又称接收器)显示为$this$checkArguments。如何为此参数添加 KDoc 文档注释?使用@param $this$checkArguments似乎没有记录它。