はじめに
前回は、はじめてのKotlinの文法:enumについて学習しました。今回はKotlinの文法:スマートキャストついて説明していきます。以下は前回までの記事です。
第2章:Kotlinの文法
- 2.1 変数を参照してください。
- 2.2 関数を参照してください。
- 2.3 データ型を参照してください。
- 2.4 配列を参照してください。
- 2.5 コレクションを参照してください。
今回はKotlinのスマートキャストの機能について説明します。Kotlinは、Flow-Sensitive Typeと呼ばれる型システムを持っています。制御フローによってある変数や式の型が変わる型システムの総称のことで、Kotlinではスマートキャスト(Smart cast)と呼んでいます。
■2.12.1 スマートキャストの使用方法
通常、安全なキャストなしでnull許容型のStringにアクセスしようとすると、コンパイルエラーが発生します。
var message: String? = "Hello!"
print(message.length) // コンパイルエラー
上記の式を解くために、スマートキャスト(Smart cast)を使います。
var message: String? = "Hello!"
if(message != null) { // スマートキャスト
print(message.length) // プロパティにアクセス可能
}
}
ifの条件式でnullチェックをすることにより、その中ではnot-nullableな型として扱うことができます。
Javaでは、キャストを行う場合、instanceof演算子を使用し、ダウンキャストを行います。
// Java
Animal animal = new Cat();
if (animal instanceof Cat) {
Cat cat = (Cat)animal; // ダウンキャスト
cat.catMethod(); // `Cat` のメソッドを使う処理
}
一度instanceofでanimalがCatであると確認したにも関わらず、その後 Cat へのダウンキャストが必要になります。直前の if 文で animal が Cat であることを確認しているのに、明示的にキャストしなければならないのは冗長です。
Kotlinではスマートキャスト(Smart cast)により、animalは自動的にCatにキャストされます。
//Kotlin
val animal = Cat()
if (animal is Cat) { // Smart Cast
animal.catMethod() // `Cat` のメソッドを使う処理
}
when文を使うことで、更にスマートキャストを活用できます。
val list: List<Any> = listOf('a', 3, "abc", true)
for (e in list) {
val result: Any? = when(e) {
is Int -> e + 3
is String -> e.toUpperCase()
is Char -> e
is Boolean -> e.not()
else -> null
}
println(result)
}
おわりに
いかがでしょうか。Javaではキャストの際にinstanceof演算子を使用し、ダウンキャストを行っておりましたが、Kotlinではスマートキャストを利用してまさにスマートにキャストを行うことができました。
お次は、例外について説明します。
お知らせ
プロマリのブログで昨日7月26日(金)気になるNews記事をまとめてみました。皆様も面白いニュースがありましたら教えてくださいね。
written by たみと@プロマリ