Kotlinでジェネリック型をテストしようとしています。
if (value is Map<String, Any>) { ... }
しかし、コンパイラは
消去されたタイプのインスタンスを確認できません:jet.Map
通常のタイプのチェックはうまく機能します。
if (value is String) { ... }
Kotlin 0.4.68が使用されます。
ここに何が欠けていますか?
問題は、型引数が消去されることです。したがって、実行時にこれらの文字列とAnyについての情報がないため、完全な型マップと照合することはできません。
これを回避するには、ワイルドカードを使用します。
if (value is Map<*, *>) {...}
JVMは汎用タイプ情報を削除します。しかし、Kotlinはジェネリックを具体化しました。ジェネリック型Tがある場合、インライン関数の型パラメーターTを具体化としてマークして、実行時にチェックできるようにすることができます。
だからあなたができる:
inline fun <reified T> checkType(obj: Object, contract: T) {
if (obj is T) {
// object implements the contract type T
}
}