はじめに
Kotlin の型システムは Null 安全性 を重視して設計されており、Java の代表的なエラーである NullPointerException (NPE) を大幅に防げます。
この記事では次の内容を解説します:
- Null許容型と null 安全機構
-
?/!!/ 安全呼び出し?./ Elvis 演算子?: - スマートキャスト (
is/as) - プラットフォーム型
1. Null許容型と null 安全
Kotlin では 型ごとに null 許容かどうか を区別します。
val a: String = "Hello"
// a = null // ❌ コンパイルエラー
val b: String? = null // ✅ nullを代入可能
String は 非null型、String? は null許容型。
2. Null 安全の演算子
(1) ? : null許容型の宣言
val s: String? = "Kotlin"
(2) !! : 強制アンラップ
- nullの可能性があっても「絶対にnullじゃない」と保証する場合に使う
- 実行時にnullなら
NullPointerExceptionが発生
val s: String? = null
val length = s!!.length // ❌ 実行時にNPE
(3) 安全呼び出し ?.
- nullの場合は処理をスキップして
nullを返す
val s: String? = "Kotlin"
println(s?.length) // 6
val t: String? = null
println(t?.length) // null
(4) Elvis 演算子 ?:
- 左辺がnullなら右辺を返す
val s: String? = null
val length = s?.length ?: 0
println(length) // 0
3. スマートキャスト(Smart Cast)
Kotlin では is チェックのあと自動で型がキャストされます。
fun printLength(obj: Any) {
if (obj is String) {
// この中では obj は String として扱える
println(obj.length)
}
}
is の否定 !is も利用可能。
4. 型キャスト as
- 明示的にキャストする場合は
asを使う - 安全にキャストする場合は
as?を使い、失敗時にnullを返す
val obj: Any = "Hello"
val str: String = obj as String
val num: Int? = obj as? Int // 失敗して null
5. プラットフォーム型
Java との相互運用時、Kotlin コンパイラは null安全性の情報を持たない型 を「プラットフォーム型」として扱います。
// Javaメソッド: String getName()
val name = javaObject.name // String! という型(非nullか不明)
-
String!はKotlinコード上ではStringともString?とも扱える曖昧な型 - 呼び出し側が責任を持って null 安全を保証する必要がある
まとめ
-
Null許容型:
String?として宣言 -
演算子:
-
!!→ 強制アンラップ(危険) -
?.→ 安全呼び出し -
?:→ Elvis 演算子(デフォルト値)
-
-
スマートキャスト:
isで型チェック後に自動キャスト -
型キャスト:
as(強制)、as?(安全) - プラットフォーム型: Java からの呼び出し時に null 安全が不明な型