【KotlinとJava】is チェックとスマートキャスト
KotlinとJava
今回はスマートキャストのサンプルだ。Kotlinはとても賢く、プログラムする人の気持ちを分かってくれるようだ!?
is-checks and smart casts.kt
fun main(args: Array<String>) {
println(getStringLength("aaa"))
println(getStringLength(1))
}
fun getStringLength(obj: Any): Int? {
if (obj is String) {
return obj.length // String型へのキャストは必要なし
}
return null
}
getStringLength
関数はどんな型の変数も許容してくれる、any
型の変数を持ち、それがString
型であったらその長さを返却するという処理を行っている。
下部のJavaのコードと比較を行いながら読み進めてほしい。
is チェック
if (obj is String)
の中のis
はオブジェクトがその型であるかを判断してくれる。Javaでいうところのinstanceof
と同じ機能だろうか。
ちなみに否定形はif (!(obj is String))
ではなくif (obj !is String)
である。英語の文章のようだ。
スマートキャスト
if文の次の行をKotlinとJavaで比較してみよう。
return obj.length
return ((String) obj).length();
JavaのほうはString型
にキャストされている。Kotlinのコードを見ると、キャストせずに、obj
変数があたかもString型
であるかのようにふるまっている。
よく考えると、直前のif文で型の判断をしているのだから、if文のブロック内ではString型
であることが当たり前である。Kotlinはこんなところにも気を配ってくれるのだ。
Javaで記述
対比ができるようにJavaでも同じものを記述してみよう。
public class Exp08 {
public static void main(String[] args) {
System.out.println(getStringLength("aaa"));
System.out.println(getStringLength(1));
}
private static Integer getStringLength(Object obj) {
if (obj instanceof String) {
return ((String) obj).length();
}
return null;
}
}
String型
にキャストしているところは一見何をしているのかわからないね。
コメント
コメントを投稿