Kotlin - Javaとの相互運用: KotlinからJavaのコードを呼ぶ方法
Kotlinは、Javaとの相互運用性を主眼に置いて構築されました。既存のJavaコードは、自然な方法でコトリンから呼び出すことが可能であり、逆にKotlinコードをJavaからもスムーズに利用することができます。ほとんどのJavaコードは、適応的に問題なく利用可能です。本教程においては、JavaとKotlinとの間の相互運用性に関する事項と、KotlinからJavaコードを呼び出す際の手法について詳細に解説いたします。
Kotlin - Javaとの相互運用
1. Kotlinのセットアップ
Kotlinプロジェクトの生成は、IntelliJ、Eclipse、そしてコマンドラインを用いて極めて容易です。
2.** 基本的考え方**
Javaからコトリンへの呼び出しは、その根底にある相互運用性の概念に基づいて構築されており、このため、円滑且つシームレスに行われます。
まず、コアJavaを用いたCustomerクラスを生成しましょう。
public class Customer {
private String firstName;
private String lastName;
private int age;
// standard setters and getters
}
ここでは、コアのJavaを利用して、Customerクラスを構築してみましょう。
3.ゲッターおよびセッター
次に、この単純なJava POJOを用いて、Kotlinの特徴を試してみましょう。こうしたタイプのメソッドは、Javaの慣習に基づくゲッターやセッターとは異なり、コトリンではプロパティとして表現されます。
val customer = Customer()
customer.firstName = "Frodo"
customer.lastName = "Baggins"
assertEquals(customer.firstName, "Frodo")
assertEquals(customer.lastName, "Baggins")
4.Null安全
Kotlinはヌル安全性の機能で著名ですが、これはJavaには当てはまらない現象です。従って、Javaオブジェクトに対して同様のアプローチは実用的でありません。文字列配列の単純な例を通じて、この差異が明らかとなります。
val characterList = ArrayList<String>()
characterList.add("Bilbo")
val character = list[0]
val a: String? = character
val a: String = character
5.Arrays
Kotlinにおいて、配列は不変です。したがって、実行時エラーを回避するために、Array<Int>をArray<Any>に代入することはできません。
public class ArrayExample {
public int sumValues(int[] nums) {
int res = 0;
for (int x:nums) {
res += x;
}
return res;
}
}
クラスを例に挙げることで、この挙動を確認しましょう。
val ex = ArrayExample()
val numArray = intArrayOf(1, 2, 3)
assertEquals(ex.sumValues(numArray), 6)
6. 可変長引数
Javaにおいて、メソッドへ任意の数の引数を渡すことができます。
public int sumArgValues(int... sums) {
// same as above
}
Kotlinにおいても同様のプロセスが適用されますが、配列を渡す際にはスプレッド演算子「*」を用いる必要があります。
assertEquals(ex.sumValues(*numArray), 6)
ただし、現時点では可変長引数メソッドへのnullの渡し方に制約があります。
7. Exceptions
Kotlinでは、すべての例外がチェックされません。これは、コンパイラが例外の捕捉を必須としない特徴です。
// In our Java code
public void writeList() throws IOException {
File file = new File("E://file.txt");
FileReader fr = new FileReader(file);
fr.close();
}
// In Kotlin
fun makeReadFile() {
val ax = ArrayExample()
ax.writeList()
}
8. Reflection
要約すると、リフレクションはコトリンクラスとJavaクラスの両方で効果を発揮します。ゲッターメソッドとセッターメソッド、JavaフィールドのKProperty、さらにはコンストラクタのKFunctionに至るまで、様々な要素にアクセス可能です。
val instance = Customer::class.java
val constructors = instance.constructors
assertEquals(constructors.size, 1)
assertEquals(constructors[0].name,"com.baeldung.java.Customer")
9. オブジェクトメソッド
Kotlinにおいてオブジェクトがインポートされると、次のタイプの参照が可能となります。
val instance = Customer::class
val supertypes = instance.supertypes
assertEquals(supertypes[0].toString(), "kotlin.Any")
結論
この簡潔なチュートリアルを通じて、KotlinとJavaの相互運用性に関する理解を深めることができました。また、Kotlinがどのように全体のコードの冗長性を軽減するかを示すため、幾つかの具体的な例を検討しました。
Kotlinは、Javaとの相互運用性を主眼に置いて構築されましたが、二つ のプログラミング言語の間に、違いがあります。関心をお持ちの方には、 KotlinとJavaの比較の分析の参考資料をリンクいたしすので、チェック してください。
参考資料:
Discussion