Kotlinの型システムの概要
Kotlinは、Javaと同様に静的型付け言語です。しかし、Kotlinの型システムはJavaよりも豊富で、より厳密に型を扱うことができます。
型チェックとは何か?
型チェックとは、ある変数や式が期待される型を持っているかどうかを確認することです。Kotlinでは、is演算子を使用して型チェックを行うことができます。
型チェックの方法
is演算子
is演算子は、ある変数が特定の型に属しているかどうかをチェックするために使用されます。
if (obj is String) {
// objはString型であることが保証される
}
!is演算子
!is演算子は、ある変数が特定の型に属していないかどうかをチェックするために使用されます。
if (obj !is String) {
// objはString型ではないことが保証される
}
安全なキャストと非安全なキャストの違い
Kotlinでは、安全なキャストと非安全なキャストの2種類があります。
安全なキャスト(as?演算子) は、キャストが失敗した場合にnullを返します。これにより、nullチェックを省略することができます。
非安全なキャスト(as演算子) は、キャストが失敗した場合にClassCastExceptionがスローされます。
安全なキャストの方法
as?演算子
as?演算子は、安全なキャストを行うために使用されます。
val str: String? = obj as? String
エルビス演算子
エルビス演算子は、null合体演算子とも呼ばれ、安全なキャストとnullチェックを同時に行うためにも使用されます。
val str: String = obj as? String ?: "default"
非安全なキャストの方法
as演算子
as演算子 は、非安全なキャストを行うために使用されます。この演算子は、キャストが失敗した場合にClassCastExceptionをスローします。
val str: String = obj as String
非安全なキャストは、キャストが失敗する可能性があるため、常にtry-catchブロックで囲む必要があります。
try {
val str: String = obj as String
} catch (e: ClassCastException) {
// キャストが失敗した場合の処理
}
スマートキャスト
Kotlinは、スマートキャストと呼ばれる機能を提供しています。これにより、is演算子を使用して変数の型をチェックし、その後にその変数を直接キャストすることができます。
if (obj is String) {
val str: String = obj // スマートキャストが有効になる
}
Kotlinコンパイラは、is演算子がtrueであることを検出すると、その後のコードブロックで変数の型を自動的に推論します。
これにより、コードの読みやすさが向上し、冗長なキャストを避けることができます。
型パラメーターの型チェックとキャスト
Kotlinのジェネリクスを使用して、クラスや関数を型パラメーター化することができます。型パラメーターの型をチェックするには、is演算子を使用することができます。
fun <T> example(obj: T) {
if (obj is List<*>) {
val list: List<Any?> = obj
}
}
上記の例では、List型の型パラメーターが不明なため、List<*>として扱われます。
is演算子でチェックすることで、変数がList型であることを保証し、Listにキャストすることができます。
まとめ
普段から使用している型チェックやキャストですがスマートキャストなどをうまく活用すればもっと読みやすいコードが書けそうだなと思いました。
Kotlin安全なコードを書くために言語的に支援する機能が数多くあるので好きです。もっと使いこなせるようにしないとなあ!
ではまった!!