@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
) {
:
}
スポンサーリンク
関連記事:
投稿が見つかりませんでした。
スポンサーリンク
