makotan _at_ gmail dot com

Javaとの親和性を確認してみた

ことりんからJavaを呼び出したり、Javaからことりんを呼び出したりするのはどのくらいスムーズに出来るのか?って問題
知ってるJVM系言語でJavaから呼び出す時は専用のAPIを経由して呼び出したりして実質的に呼び出し専用のモジュールが必要だったり、Javaのクラスを使うとその言語の特徴的な機能を使えないとか普通にあったので・・・
呼び出しが可能容易に呼び出し可能の差は凄くでかい印象


とりあえずコードを書いてみた
kotlinのデータクラス。

data class KotoUser(val kotoId :String , val userName : String)

これをJavaのインタフェースで使うときはどうするか??

public interface KotoService {
    
    KotoUser get(String kotoId);
    
}

なんの工夫も要らなかった!!
Javaのクラスですか?って位そのまま


JavaのインタフェースをKotlinで実装してみる

class KotoServiceImpl : KotoService {
    override fun get(kotoId: String?): KotoUser? {
        if (kotoId != null) {
            return KotoUser(kotoId , "hogehoge$kotoId")
        } else {
            return null
        }
    }
}

これまたなんの工夫もなく、しかもKotoUserと同じファイルなんだけどなぁ・・・
念のためclean して再コンパイルしてみたんだけどエラーも何も起きず。
ことりん恐るべし


Kotlinで実装したクラスをJavaでnewして使ってみる

public class KotoServiceUser {
    private KotoService service = new KotoServiceImpl();
    
    public KotoUser getUser() {
        return service.get("123");
    }
}

さっきまでの実験で出来そうだと思ったのでやってみたって程度だけど、なんの問題も無かった


まとめるとこういう感じ
Kotlinのdata classをJavaのinterfaceで使い、JavaのinterfaceをKotlinで実装し、Kotlinの実装をJavaから使う
この一連の流れを実装するくらいなら同一言語を使っているのと違和感は全く感じない
結論は親和性は文句なしに高い!
ドキュメントを見るとある程度の注意点はあるけど、Kotlin使うようになればJavaで書いたライブラリを使うとかが主になる気がするから気にしなくなりそう


元々そういう情報があったんだけど実際にやってみると凄いね