Kotlin でジェネリック型をテストしようとしています。
if (value is Map<String, Any>) { ... }
しかし、コンパイラは文句を言います
消去されたタイプのインスタンスを確認できません: jet.Map
ノーマルタイプでのチェックはしっかり効きます。
if (value is String) { ... }
Kotlin 0.4.68 を使用しています。
ここで何が欠けていますか?
Kotlin でジェネリック型をテストしようとしています。
if (value is Map<String, Any>) { ... }
しかし、コンパイラは文句を言います
消去されたタイプのインスタンスを確認できません: jet.Map
ノーマルタイプでのチェックはしっかり効きます。
if (value is String) { ... }
Kotlin 0.4.68 を使用しています。
ここで何が欠けていますか?
問題は、型引数が消去されているため、完全な型 Map に対してチェックできないことです。これは、実行時に String と Any に関する情報がないためです。
これを回避するには、ワイルドカードを使用します。
if (value is Map<*, *>) {...}
上記の解決策を試してみました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?>?) {
}