2017-06-25 7 views
0

今日、私はKotlin Docsのこのセクションに出くわしました。 「必要なときに自動的にキャスト(安全)を挿入」Kotlinがいるようだ「スマートキャスト」と呼ばれる:コンパイラはIS-を追跡するためこの例ですでに型が保証されているにもかかわらず、型をキャストする必要があるのはなぜですか?

多くの場合、1は、 Kotlinに明示的なキャスト演算子を使用する必要はありません。不変の値 および挿入のためのチェック(安全な)必要に応じて自動的にキャスト:

fun demo(x: Any) { 
    if (x is String) { 
     print(x.length) // x is automatically cast to String 
    } 
} 

私は「スマートキャスト」は、この例では何をするか理解していません。 xは常に文字列になるため、キャストする必要はありません。x.lengthは常に動作し、キャストは必要ありません。 printの行はどうなっていますか?前もって感謝します!

答えて

6

xは、タイプがAnyであり、そのタイプは.lengthプロパティを持たない。しかし、ifブロック内では、xが実際にはStringであることが判明しているので、そのタイプをスマートキャストして、メソッドを呼び出してStringクラスのプロパティにアクセスできます。

このコードのJavaバージョンは、次のようになり、あなたも型チェックを行った後Stringへの明示的なキャストが必要になりたい:

void demo(Object x) { 
    if(x instanceof String) { 
     System.out.print(((String) x).length()); 
    } 
} 

これはKotlinがあなたのために簡素化するものです。

+1

ああ、それはそれをクリアします、ありがとう。 Pythonから来て、私はまだ静的な型定義の周りに私の頭をラッピングしています。 – Nearoo

2

スマートキャストなしでは、lengthがAnyに存在しないため、実際には型が実際にStringであることをコンパイラーに通知する必要があります。

println((x as String).length) 

これはもはや必要ではありません。

+1

ありがとうございます。 Pythonから来て、私は静的に型付けされた言語を頭で囲む必要があります。パラメータで指定された型が 'string'でないときに' x.length'がエラーを投げなければならないことに気づいていません。 – Nearoo

+0

メソッドを呼び出すときに 'x'が' String'でなかった場合、Pythonでもエラーが発生します。 – Strelok

+0

いいえ、動的に型指定されているので、正常に動作します。タイプに関するチェックはまったく行われません。 xが文字列でない場合、メソッドwoulfは単にif節なしで実行されます。それが文字列だった場合は、キャストする必要はありません。オブジェクトxに属性の長さがあるかどうかを調べるだけで、型を気にする必要はありません。それが、私がコトリンについて混乱した理由です。 – Nearoo

関連する問題