Kotlin Javaの相互運用性

Kotlin Java相互運用性

1. 概要

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

2. Kotlinのセットアップ

Kotlinプロジェクトの作成は、IntelliJ、Eclipse、さらにはコマンドラインを使用して非常に簡単です。ただし、このチュートリアルでは、デモに必要なものがすでに含まれているため、前のチュートリアルIntroduction to Kotlinのインストール手順に従います。目的。

3. 基礎

Calling Java from Kotlin is straightforward and smooth since it was built with the idea of interoperability

コア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")

オブジェクトをインスタンス化するためのthe new keyword is not requiredは注目に値します。

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

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

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

5. ヌルの安全性

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

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

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

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

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

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

6. 配列

Kotlinでは、配列は不変です。つまり、ランタイムの失敗を防ぐためにArray<Int>Array<Any>に割り当てることはできません。

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

public class ArrayExample {

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

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

        return res;
    }
}

KotlinからのIf we want to pass an array of primitives to this method, we have to use one of the specialized classes

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

assertEquals(ex.sumValues(numArray), 6)

7. バラールス

Javaは、メソッドに任意の数の引数を渡す機能を提供します。

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

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

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

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

8. 例外

In Kotlin all exceptions are uncheckedは、コンパイラが例外をキャッチするように強制しないことを意味します。

// 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.example.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. 結論

このクイックチュートリアルでは、Kotlin Java Interoperabilityについてより深く理解することができます。 Kotlinが一般的に全体的に冗長なコードにつながる方法を示すために、いくつかの簡単な例を見てきました。

いつものように、これらすべての例とスニペットの実装はover on GitHubにあります。 これはMavenベースのプロジェクトであるため、インポートと実行が簡単である必要があります。