お詫びと訂正
この記事の公開時点ではorg.springframework.lang内のNonNull/Nullableアノテーションも機能すると記載していましたが、これは誤りでした。
これらのアノテーションを用いた場合、IDE上の補完表記は変化するものの、コンパイル時には警告しか出ない状態でした。
お詫びして訂正します。
前書き
org.jetbrains.annotations内のNotNull/Nullableといったアノテーションを用いることで、JavaのフィールドをKotlinからKotlinっぽく扱えるようになります。
同様に利用可能なアノテーションは他にも有りますので、以下をご覧下さい。
- Calling Java from Kotlin - Kotlin Programming Language
- kotlin/JvmAnnotationNames.kt at master · JetBrains/kotlin
やり方
以下のように付与するだけで大丈夫です。
import org.jetbrains.annotations.NotNull;
public class Sample {
private String field;
@NotNull
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}
付与するとどうなるか
付与前は以下の画像のように、Kotlin上ではString!型(Platform型)で扱われています。

以下のように、アノテーションをNullableに変更するとことで、String?型として扱うこともできます。
- import org.jetbrains.annotations.NotNull;
+ import org.jetbrains.annotations.Nullable;
- @NotNull
+ @Nullable
public String getField() {
補足
POJO的なオブジェクトに対してアノテーションを振る場合は、ゲッターに振った方が良いです。
画像の通り、フィールドに振ってしまうと「初期化しろ」と怒られるためです。

意義
JavaプロジェクトにKotlinを導入したり、KotlinからJavaのフレームワークを使う場合、しばしば「値無しコンストラクタでオブジェクト初期化 -> セッターで各値を注入」的な挙動をされる場合が有ります。
このような場合、対象オブジェクトをKotlinで書こうとすると結構な工夫をする必要があり、「これKotlinで書く意味有るんだっけ」となれます。
既存のJavaオブジェクトがあり、それを一々全て書き換える必要があるなら、労力もバカになりません。
初めからDataクラスにマッピングできるようにユーティリティを作るというのも手ですが、書き換え以上に初期コストは掛かるでしょう。
そんなことをする位なら、ゲッターにアノテーションを振るだけで済ませた方がスマートなんじゃないかなと思います(無論何が何でもフルKotlinにしたいという場合は別ですが、実現できる挙動が同等であれば別にJavaで書いていいんじゃないかとは思います)。

