17
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Kotlinでの型チェックとキャスト

Last updated at Posted at 2023-03-01

Kotlinの型システムの概要

Kotlinは、Javaと同様に静的型付け言語です。しかし、Kotlinの型システムはJavaよりも豊富で、より厳密に型を扱うことができます。

型チェックとは何か?

型チェックとは、ある変数や式が期待される型を持っているかどうかを確認することです。Kotlinでは、is演算子を使用して型チェックを行うことができます。

型チェックの方法

is演算子

is演算子は、ある変数が特定の型に属しているかどうかをチェックするために使用されます。

kotlin
    if (obj is String) {
       // objはString型であることが保証される
    }

!is演算子

!is演算子は、ある変数が特定の型に属していないかどうかをチェックするために使用されます。

kotlin
    if (obj !is String) {
       // objはString型ではないことが保証される
    }

安全なキャストと非安全なキャストの違い

Kotlinでは、安全なキャスト非安全なキャストの2種類があります。

安全なキャスト(as?演算子) は、キャストが失敗した場合にnullを返します。これにより、nullチェックを省略することができます。

非安全なキャスト(as演算子) は、キャストが失敗した場合にClassCastExceptionがスローされます。

安全なキャストの方法

as?演算子

as?演算子は、安全なキャストを行うために使用されます。

Kotlin
    val str: String? = obj as? String

エルビス演算子

エルビス演算子は、null合体演算子とも呼ばれ、安全なキャストとnullチェックを同時に行うためにも使用されます。

kotlin
    val str: String = obj as? String ?: "default"

非安全なキャストの方法

as演算子

as演算子 は、非安全なキャストを行うために使用されます。この演算子は、キャストが失敗した場合にClassCastExceptionをスローします。

kotlin
    val str: String = obj as String

非安全なキャストは、キャストが失敗する可能性があるため、常にtry-catchブロックで囲む必要があります。

kotlin
    try {
        val str: String = obj as String
    } catch (e: ClassCastException) {
        // キャストが失敗した場合の処理
    }

スマートキャスト

Kotlinは、スマートキャストと呼ばれる機能を提供しています。これにより、is演算子を使用して変数の型をチェックし、その後にその変数を直接キャストすることができます。

kotlin
    if (obj is String) {
        val str: String = obj // スマートキャストが有効になる
    }

Kotlinコンパイラは、is演算子がtrueであることを検出すると、その後のコードブロックで変数の型を自動的に推論します。
これにより、コードの読みやすさが向上し、冗長なキャストを避けることができます。

型パラメーターの型チェックとキャスト

Kotlinのジェネリクスを使用して、クラスや関数を型パラメーター化することができます。型パラメーターの型をチェックするには、is演算子を使用することができます。

kotlin
    fun <T> example(obj: T) {
        if (obj is List<*>) {
            val list: List<Any?> = obj
        }
    }

上記の例では、List型の型パラメーターが不明なため、List<*>として扱われます。
is演算子でチェックすることで、変数がList型であることを保証し、Listにキャストすることができます。

まとめ

普段から使用している型チェックやキャストですがスマートキャストなどをうまく活用すればもっと読みやすいコードが書けそうだなと思いました。

Kotlin安全なコードを書くために言語的に支援する機能が数多くあるので好きです。もっと使いこなせるようにしないとなあ!

ではまった!!

17
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?