🎉

Kotlin - Javaとの相互運用: KotlinからJavaのコードを呼ぶ方法

2023/08/28に公開

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の比較の分析の参考資料をリンクいたしすので、チェック   してください。
 参考資料: 
https://miichisoft.com/kotlin-java-main-difference-how-to-choose/

Discussion