Kotlin Academy · レッスン

スマートキャスト

チェック後の自動キャストを学びます

レッスン 2/413 ステップ

「スマートキャスト」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

スマートキャストとは

値の型をチェックすると、Kotlinはその事実を記憶します。チェックしたブロック内では、その値を自動的に絞り込まれた型として扱います。

この機能をスマートキャストと呼び、手動のキャストが不要になります。

isの後のスマートキャスト

isチェックが成功すると、キャストを記述しなくても、その値をチェックした型として使用できます。

コンパイラーが自動的にキャストを挿入します。

fun describe(x: Any) {
    if (x is String) {
        println(x.length) // x is smart-cast to String
    }
}

fun main() {
    describe("hello")
}

nullチェック後のスマートキャスト

スマートキャストはnull許容性にも対応しています。値がnullでないことを確認すると、その値はnull非許容として扱われます。

fun length(text: String?): Int {
    if (text != null) {
        return text.length // smart-cast to non-null String
    }
    return 0
}

fun main() {
    println(length("abc"))
    println(length(null))
}

whenでのスマートキャスト

when内の型チェックでも、各分岐でスマートキャストが有効になります。

複数の型の可能性を扱う場合に、これがKotlinの慣用的な方法です。

fun area(shape: Any): Double = when (shape) {
    is Int -> shape.toDouble()
    is String -> shape.length.toDouble()
    else -> 0.0
}

fun main() {
    println(area(5))
    println(area("hello"))
}

早期リターンによるスマートキャスト

値がnullの場合に早期リターンすると、コンパイラーはその後の値がnullでないことを認識します。

関数の残りの部分では、その値を安全に使用できます。

fun process(text: String?) {
    if (text == null) return
    println(text.uppercase()) // smart-cast here
}

fun main() {
    process("data")
    process(null)
}

Elvisリターンによるスマートキャスト

Elvis演算子とreturnを組み合わせると、残りのコードでもスマートキャストが有効になります。

fun process(text: String?) {
    val safe = text ?: return
    println(safe.length) // safe is non-null
}

fun main() {
    process("hi")
    process(null)
}

複合条件

スマートキャストは、&&を使った複合条件の論理を考慮します。

左側で型をチェックした後は、右側ですでに絞り込まれた型が認識されます。

fun check(x: Any) {
    if (x is String && x.length > 3) {
        println("long string")
    } else {
        println("other")
    }
}

fun main() {
    check("hello")
    check(2)
}

スマートキャストが失敗する場合

スマートキャストには、チェックから使用までの間に値が変化しないという保証が必要です。

同時に変更される可能性がある可変なvarでは、スマートキャストできない場合があります。確実にスマートキャストするには、valを優先してください。

fun main() {
    val text: String? = "stable"
    if (text != null) {
        println(text.length) // val smart-casts cleanly
    }
}

ローカルvalが最も安全

値をローカルのvalにコピーすると、スマートキャストが確実に機能します。

これは、null許容プロパティを扱うときによく使われるパターンです。

class Box(val content: String?)

fun main() {
    val box = Box("item")
    val c = box.content
    if (c != null) {
        println(c.uppercase())
    }
}

スマートキャストと明示的なキャスト

スマートキャストによって、ほとんどの明示的なasキャストを置き換えられます。型が証明できる場所でのみ適用されるため、より安全です。

次は、明示的なisとasについて学びます。

fun main() {
    val x: Any = "text"
    if (x is String) {
        // no need for (x as String)
        println(x.reversed())
    }
}

まとめ

スマートキャストを使うと、コンパイラーが型を自動的に絞り込めます。

  • isチェックの後 → その型にキャストされます
  • nullチェックの後 → null非許容型にキャストされます
  • if、when、早期リターンの後で使用できます
  • valで最も確実に機能します
fun render(x: Any): String {
    if (x is Int) return "number " + x
    if (x is String) return "text " + x.uppercase()
    return "unknown"
}

fun main() {
    println(render(7))
    println(render("go"))
}

理解度チェック

スマートキャストについての理解度を確認しましょう。

まとめ

スマートキャストについて学びました。

  • 型チェックとnullチェックによって、型が自動的に絞り込まれます
  • if、when、早期リターンの後で使用できます
  • valを使うと、最も確実にスマートキャストできます

次は、is演算子とas演算子を直接学びます。

無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「スマートキャスト」レッスンは無料ですか?

はい。「スマートキャスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「スマートキャスト」で何を学びますか?

チェック後の自動キャストを学びます ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「スマートキャスト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 式としてのwhen
  2. スマートキャスト
  3. isとas演算子
  4. 網羅的なwhen
← Kotlin Academyに戻る