@JvmOverloadsは「Kotlinのデフォルト付き引数を持った関数を、Javaから実行できるようにする」アノテーションです。
詳細をまとめます。
スポンサーリンク
関数の呼び出し~同一言語内~
以下は、Javaとkotlinの関数(メソッド)の定義です。
public class JavaSample { public void hoge(int value, String str, boolean bool) { // hogeの処理 } public void hoge(int value, String str) { hoge(value, str, false); } public void hoge(int value) { hoge(value, null, false); } }
class KotlinSample { fun hoge(value: Int, str: String? = null, bool: Boolean = false) { // hogeの処理 } }
JavaもKotlinも同一言語内であれば、同様な呼び出し方が可能です。
JavaSample _sample = new JavaSample(); // Javaの場合 または val _sample = KotlinSample() // Kotlinの場合 // 同一言語間の呼び出し _sample.hoge(0, "abc", true); // OK _sample.hoge(0, "abc"); // OK _sample.hoge(0); // OK
スポンサーリンク
関数の呼び出し~異なる言語間~
しかし、JavaからKotlinの関数を呼び出そうとすると、できません。逆の呼び出しは可能です。
public class JavaSample { : public void exe() { KotlinSample _kotlinSample = new KotlinSample(); // Java⇒Kotlin関数の呼び出し _kotlinSample.hoge(0, "abc", true); // OK _kotlinSample.hoge(0, "abc"); // NG _kotlinSample.hoge(0); // NG } }
class KotlinSample { : fun exe() { val _javaSample = JavaSample() // Kotlin⇒Javaメソッドの呼び出し _javaSample.hoge(0, "abc", true) // OK _javaSample.hoge(0, "abc") // OK _javaSample.hoge(0) // OK } }
JavaはKotlinのようにデフォルト付き引数を扱えないからです。
ちなみに、NGの箇所は、構文チェッカーが次のようなメッセージを出します。
'hoge(int, java.lang.String, boolean)' in 'KotlinSample' cannot be applied to '(int)'
スポンサーリンク
@JvmOverloadsの付加
上記の関数が呼び出せない問題を回避するために、Kotlinの関数へ「@JvmOverloadsアノテーション」を付加します。
class KotlinSample { @JvmOverloads fun hoge(value: Int, str: String? = null, bool: Boolean = false) { // hogeの処理 } }
Kotlinソースコードはコンパイルされるときに、Javaのオーバーロードのようなバイトコードに展開され、JavaからKotlinの関数が呼び出せるようになります。
ちなみに、コンストラクタの場合も同様です。ただし、コンストラクタ名(constructor)は省略できなくなります。
class Hoge @JvmOverloads constructor( value: Int, str: String? = null, bool: Boolean = false ) { : }
スポンサーリンク
関連記事:
投稿が見つかりませんでした。
スポンサーリンク