96

Kotlin でジェネリック型をテストしようとしています。

if (value is Map<String, Any>) { ... }

しかし、コンパイラは文句を言います

消去されたタイプのインスタンスを確認できません: jet.Map

ノーマルタイプでのチェックはしっかり効きます。

if (value is String) { ... }

Kotlin 0.4.68 を使用しています。

ここで何が欠けていますか?

4

5 に答える 5

104

問題は、型引数が消去されているため、完全な型 Map に対してチェックできないことです。これは、実行時に String と Any に関する情報がないためです。

これを回避するには、ワイルドカードを使用します。

if (value is Map<*, *>) {...}
于 2012-10-31T20:08:50.147 に答える
-1

上記の解決策を試してみましたtryCast<Array<String?>>が、パフォーマンスが大幅に低下していたため、多くのキャスティングを含むリストの特定のタスクでは、それほど素晴らしいアイデアではなかったと思います。

これは私が最終的に行った解決策です-次のように、エントリを手動でチェックしてメソッドを呼び出します:

 fun foo() {
    val map: Map<String?, Any?> = mapOf()
    map.forEach { entry ->
        when (entry.value) {
            is String -> {
                doSomeWork(entry.key, entry.value as String)
            }
            is Array<*> -> {
                doSomeWork(entry.key, (entry.value as? Array<*>)?.map {
                    if (it is String) {
                        it
                    } else null
                }?.toList())
            }
        }
    }
}


private fun doSomeWork(key: String?, value: String) {

}
private fun doSomeWork(key: String?, values: List<String?>?) {

}
于 2020-12-18T17:58:50.190 に答える