【KotlinとJava】is チェックとスマートキャスト

08 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型にキャストしているところは一見何をしているのかわからないね。

コメント

このブログの人気の投稿

【KotlinとJava】分解宣言

wxPythonでのモーダルダイアログ作成