web-dev-qa-db-ja.com

Kotlinでジェネリック型を確認するにはどうすればよいですか

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

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

しかし、コンパイラは

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

通常のタイプのチェックはうまく機能します。

if (value is String) { ... }

Kotlin 0.4.68が使用されます。

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

46
Philipp Brüll

問題は、型引数が消去されることです。したがって、実行時にこれらの文字列とAnyについての情報がないため、完全な型マップと照合することはできません。

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

if (value is Map<*, *>) {...}
66
Andrey Breslav

JVMは汎用タイプ情報を削除します。しかし、Kotlinはジェネリックを具体化しました。ジェネリック型Tがある場合、インライン関数の型パラメーターTを具体化としてマークして、実行時にチェックできるようにすることができます。

だからあなたができる:

inline fun <reified T> checkType(obj: Object, contract: T) {
  if (obj is T) {
    // object implements the contract type T
  }
}
8
menno