2017-07-13 17 views
0

私はKotlinのMap<String, Any>からデータをロードしてクラスを初期化しています。このマップはJSONから直接収集されるので、特定のキーが存在するかどうか、またはその値が予想されるタイプのものであるかどうかはわかりません。この地図を解凍するために安全に私は完璧に動作するように表示される、次のことをやっている:Kotlinの任意の配列にキャスト

a = rawData["A"] as? String ?: "" 

このデータの一部は、私は配列に開梱していますさらに、ネストされたJSON、です。私は同じようにこれを実行しようとしました:

b = rawData["B"] as? Array<String> ?: arrayOf<String>() 

しかし、私は(上記のように)アレイを使用して、これをしようとしたときのIntelliJが

警告言って、大騒ぎを蹴る:(111を、 30)コトリン:未チェックのキャスト:あれ?アレイ< Stringに>

はねじれに自分自身を取得し、この単なるIDEであるか、または、一見他のタイプのために完全に安全であるにもかかわらず配列のため、この方法で本当に危険なのですか?

答えて

2

Arrayは、修飾されたタイプであるため、実行時にその汎用パラメータを実際に確認することができるため、これをバグと呼びます。Listとは異なります。私はそれがまだ提出されているかどうかを調べることを試みたが、実際にコンパイラがあなたに警告を表示することが正しいことが判明した。 this issueへの返信でわかるように、この種のキャストではnull値の問題があります。この例のような

val a = arrayOf("foo", "bar", null) as Array<String> 
println(a[2].length) 

配列が正常にキャストされている(asを使用して、彼らはas?を使用して、例外をスローすることはありません、彼らはnullを返さない)、しかし、キャストはこれがあることを保証することはできませんArray<String>、それはArray<String?>です。

これは、後でキャスト後にArray<String>と入力された変数からnullの値を読み取ることができることを意味し、コンパイラからの警告はこれ以上ありません。

+0

「null」の各要素を個別にチェックする必要なく、安全に 'Array 'にキャストする方法はありますか? –

+0

私はそこにないと信じています。おそらく、構文と戦略の観点からは、いくつかの解決策がありますが、いつか使っているすべての要素に対して実行しなければならないと確信しています。 – zsmb13

+0

あなたの答えを理解することは、要素がまだnullである可能性があるためキャストが安全でないことでした。これは、 'Array 'と同様のキャストが安全であることを意味します。しかし、IntelliJはそれと同じ警告を投げている、 '未チェックのキャスト:Any?配列 'へ。私はあなたの答えを誤解してしまったのですか、今ここで違う何かがありますか? –

関連する問題