アノテーション:@JvmOverloads

投稿日:  更新日:

@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
) {
    :
}
スポンサーリンク

関連記事:

投稿が見つかりませんでした。
スポンサーリンク