1概要

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


2 Kotlinの設定

Kotlinプロジェクトの作成は、IntelliJ、Eclipse、さらにはコマンドラインを使用することで非常に簡単です。デモ目的に必要です。


3基礎

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

コアJavaを使用してこの

Customer

クラスを作成しましょう。

public class Customer {

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

   //standard setters and getters

}


4ゲッターとセッター

それでは、Kotlinのこの単純なJava POJOを使ってみましょう。

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

val customer = Customer()

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

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

オブジェクトをインスタンス化するために**

new

キーワードが必要ではないことは注目に値します。

この言語は可能な限り定型コードを避けようとしているので、明示的にgetter/setterを呼び出すことはしません。フィールド表記を使用するだけでそれらを使用できます。

Javaクラスに設定メソッドしかない場合、言語は設定のみのプロパティをサポートしていないため、プロパティにアクセスできなくなります。

メソッドが

void

を返す場合、Kotlinから呼び出されると

Unit

が返されます。


5ヌル安全性

Kotlinは、その安全性が無効であることでよく知られていますが、私たちが知っているように、これはJavaの場合には当てはまりません。

String

配列があると、非常に単純な例が見られます。

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

Kotlinは、プラットフォーム型の変数に対してメソッドが呼び出されているときに、コンパイル時にnull許容エラーを表示しません - そしてこの型は言語で明示的に書くことができません。値が割り当てられるとき、私たちはこの推論に頼ることができます、あるいは私たちはちょうど私たちが期待するタイプを選ぶことができます:

[source,actionscript3,gutter:,true]

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

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

結局、コンパイラはnullを避けるために最善を尽くしますが、それでも、総称のためにそれを排除することは不可能です。

===  **  6. 配列**

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

だから私たちは例のクラスがあります:

[source,java,gutter:,true]

public class ArrayExample {

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

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

        return res;
    }
}

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

[source,java,gutter:,true]

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

assertEquals(ex.sumValues(numArray), 6)

===  **  7.  Varargs **

Javaでは、メソッドに引数をいくつでも渡すことができます。

[source,java,gutter:,true]

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

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

[source,java,gutter:,true]

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

現在のところ、__null__をvarargsメソッドに渡すことはできません。

===  **  8例外**

**  Kotlinでは、すべての例外がチェックされていない** ので、コンパイラは例外をキャッチするよう強制しません。

[source,java,gutter:,true]

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

この簡単なチュートリアルでは、

Kotlin Java Interoperability

についてさらに理解を深めることができます。 Kotlinが一般的に冗長度の低いコード全体をどのように導くかを示すためにいくつかの簡単な例を見ました。

いつものように、これらすべての例とスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/core-kotlin[GitHubで動く]にあります。これはMavenベースのプロジェクトなので、インポートして実行するのは簡単なはずです。