私はkotlin-stdlibの@JvmSynthetic
注釈を見つけました。それは何のためか不思議ですが、残念ながら、それは文書化されていません。Kotlinの@JvmSyntheticの使用目的は何ですか?
私が理解する限り、それをプログラム要素に適用すると、synthetic
修飾子が対応するバイトコード要素に追加されます。その結果、要素は、Javaから見えなくなる:
class MyClass {
@JvmSynthetic
fun f() { }
}
:
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クラスのメンバーを上書きすることを禁止できますか?
慎重に扱う必要がある危険なツールのようです、まだそれは 'kotlin-stdlib'の一部ですが、それは公開APIです。通常の開発者(あるいはライブラリ/ツール開発者)が遭遇する可能性のある '@ JvmSynthetic'の使用例があるはずです。また、 '合成'メソッドは 'javac'によって幅広く使用され、ネストされたクラスに対してのみ使用されます。少なくとも、別のシグネチャを持つメソッドをオーバーライドするには(非ジェネリックメソッドでオーバーライドされたジェネリックメソッドを含む)。 – hotkey