Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Kotlin辞典

  1. トップページ
  2. Kotlin辞典
  3. スマートキャスト / as?

スマートキャスト / as?

Kotlinのスマートキャストは、型チェック(『is』)後にキャスト不要で使える機能です。『as』は明示的なキャスト、『as?』は失敗時にnullを返す安全なキャストです。

構文
// is でチェック後、スマートキャストが自動で適用されます。
fun describe(value: Any) {
    if (value is String) {
        println(value.length)  // String 型として使えます。
    }
}

// as で明示的にキャストします(失敗すると ClassCastException)。
val str: String = value as String

// as? で安全にキャストします(失敗すると null)。
val str: String? = value as? String

// when 式でのスマートキャスト
when (value) {
    is Int -> println(value * 2)
    is String -> println(value.uppercase())
    is List<*> -> println(value.size)
}
構文一覧
構文概要
value is 型型チェックを行います。true の場合、以降はスマートキャストが適用されます。
value !is 型型チェックの否定です。
value as 型明示的なキャストです。失敗すると ClassCastException がスローされます。
value as? 型安全なキャストです。失敗すると null を返します。
when (value) { is 型 -> }when 式でスマートキャストを活用します。
サンプルコード
// sealed class で型階層を表現します。
sealed class Shape
data class Circle(val radius: Double) : Shape()
data class Rectangle(val width: Double, val height: Double) : Shape()
data class Triangle(val base: Double, val height: Double) : Shape()

// スマートキャストで各型のメソッドを呼び出します。
fun area(shape: Shape): Double {
    return when (shape) {
        is Circle -> Math.PI * shape.radius * shape.radius
        is Rectangle -> shape.width * shape.height
        is Triangle -> 0.5 * shape.base * shape.height
    }
}

fun printInfo(value: Any) {
    // is チェック後、スマートキャストが適用されます。
    when (value) {
        is Int -> println("整数: ${value * 2}")
        is String -> println("文字列(${value.length}文字): ${value.uppercase()}")
        is List<*> -> println("リスト(${value.size}件): $value")
        is Boolean -> println("真偽値: $value")
        else -> println("不明: $value")
    }
}

fun main() {
    // スマートキャストの基本
    printInfo(42)
    printInfo("Kotlin")
    printInfo(listOf(1, 2, 3))
    printInfo(true)

    // as? 安全キャスト
    val obj: Any = "Hello"
    val str: String? = obj as? String
    val num: Int? = obj as? Int  // String を Int にキャストできないので null
    println("str: $str")   // str: Hello
    println("num: $num")   // num: null

    // as? と ?: の組み合わせ
    val length = (obj as? String)?.length ?: 0
    println("長さ: $length")  // 長さ: 5

    // sealed class でのスマートキャスト
    val shapes = listOf(
        Circle(5.0),
        Rectangle(4.0, 3.0),
        Triangle(6.0, 4.0)
    )
    shapes.forEach { shape ->
        println("面積: ${"%.2f".format(area(shape))}")
    }
}
概要

スマートキャストはKotlinコンパイラが型チェック後に自動でキャストを適用する機能です。『is』チェック後のブロック内、また『&&』条件の右辺でも有効になります。ただし、varプロパティやopenプロパティではスマートキャストが効かない場合があります。

『as?』は外部データの型変換や、型が不確かな場面で安全に使えます。失敗しても例外が発生せずnullが返るため、『as? 型 ?: デフォルト値』のパターンで安全にデフォルト値を設定できます。

Nullable型の基本はNullable 型 / ?. 演算子を、sealed classとの組み合わせはsealed class / sealed interfaceを参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。