1. 概要

このチュートリアルでは、JavaとKotlin間の相互運用性について説明します。いくつかの基本的な例と、その他のより複雑なシナリオについて説明します。

2. Kotlinのセットアップ

Kotlinプロジェクトの作成は、IntelliJ、Eclipse、さらにはコマンドラインを使用して非常に簡単です。ただし、このチュートリアルでは、前のチュートリアルKotlinの概要のインストール手順を実行します。デモ目的の必要性。

3. 基礎

KotlinからのJavaの呼び出しは、相互運用性のアイデアで構築されているため、簡単でスムーズです。

コアJavaを使用してこのCustomerクラスを作成しましょう。

public class Customer {

    private String firstName;
    private String lastName;
    private int age;

    // standard setters and getters

}

4. ゲッターとセッター

Kotlinのこの単純なJavaPOJOを使用してみましょう。

これらのタイプのメソッドのJava規則に従うゲッターとセッターは、Kotlinでは属性として表されます。

val customer = Customer()

customer.firstName = "Frodo"
customer.lastName = "Baggins"

assertEquals(customer.firstName, "Frodo")
assertEquals(customer.lastName, "Baggins")

オブジェクトをインスタンス化するために新しいキーワードは必要ありませんことに注意してください。

この言語は、ボイラープレートコードを可能な限り回避しようとするため、ゲッター/セッターを明示的に呼び出さないでください。フィールド表記を使用して簡単に使用できます。

Javaクラスにsetterメソッドしかない場合、言語はset-onlyプロパティをサポートしていないため、プロパティにアクセスできないことを覚えておく必要があります。

メソッドがvoidを返す場合、Kotlinから呼び出されると、Unitが返されます。

5. ヌルセーフティ

Kotlinはnullの安全機能でよく知られていますが、ご存知のとおり、これはJavaには当てはまらないため、Kotlinからのオブジェクトには実用的ではありません。 String 配列がある場合、非常に簡単な例を見ることができます。

val characterList = ArrayList<String>()
characterList.add("Bilbo")
val character = list[0]

Kotlinは、プラットフォームタイプの変数でメソッドが呼び出されているときに、コンパイル時にnull可能性エラーを表示しません。このタイプは言語で明示的に記述できません。 したがって、値が割り当てられると、この推論に依存することも、期待するタイプを選択することもできます。

val a: String? = character
val a: String = character

どちらも許可されていますが、null以外の型の場合、コンパイラーは割り当て時にすぐにアサートします。これにより、変数がnull値を保持できなくなります。

結局、コンパイラーはnullを回避するために最善を尽くしますが、それでもジェネリックスのためにnullを排除することは不可能です。

6. 配列

Kotlinでは、配列は不変です。つまり、割り当てができません。 配列配列実行時の障害を防ぐため。

したがって、サンプルクラスがあります。

public class ArrayExample {

    public int sumValues(int[] nums) {
        int res = 0;

        for (int x:nums) {
            res += x;
        }

        return res;
    }
}

プリミティブの配列をこのメソッドに渡したい場合は、Kotlinの特殊なクラスの1つを使用する必要があります。

val ex = ArrayExample()
val numArray = intArrayOf(1, 2, 3)

assertEquals(ex.sumValues(numArray), 6)

7. Varargs

Javaには、メソッドに任意の数の引数を渡す機能があります。

public int sumArgValues(int... sums) {
    // same as above
}

プロセスは同じですが、配列を渡すためにスプレッド演算子*を使用する必要があるというわずかな違いがあります。

assertEquals(ex.sumValues(*numArray), 6)

現在、nullをvarargsメソッドに渡す可能性はありません。

8. 例外

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()
}

9. 反射

簡単に言えば、リフレクションはKotlinクラスとJavaクラスの両方で機能します。

val instance = Customer::class.java
val constructors = instance.constructors

assertEquals(constructors.size, 1)
assertEquals(constructors[0].name, "com.baeldung.java.Customer")

getterメソッドとsetterメソッド、Javaフィールドの場合は KProperty 、コンストラクターの場合はKFunctionを取得することもできます。

10. オブジェクトメソッド

オブジェクトがKotlinにインポートされると、タイプjava.lang.Objectのすべての参照がkotlin.Anyに変更されます。

val instance = Customer::class
val supertypes = instance.supertypes

assertEquals(supertypes[0].toString(), "kotlin.Any")

11. 結論

このクイックチュートリアルでは、KotlinJavaの相互運用性について理解を深めることができます。 Kotlinが一般的にどのようにコード全体の冗長性を低下させるかを示すために、いくつかの簡単な例を見てみました。

いつものように、これらすべての例とスニペットの実装は、GitHubにあります。