我如何能为您在科特林泛型类型(How can I check for generic type in

2019-07-03 11:16发布

我试图测试在科特林泛型类型。

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

但是,编译器抱怨

无法检查擦除类型的实例:jet.Map

与普通型的检查效果很好。

if (value is String) { ... }

科特林0.4.68使用。

我缺少的是在这里吗?

Answer 1:

问题是,类型参数被擦除,所以你不能对证丰满型的地图,因为在运行时没有对这些字符串的任何信息。

要解决此问题,使用通配符:

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


Answer 2:

JVM删除泛型类型的信息。 但科特林已经物化仿制药。 如果你有一个泛型类型T,你可以根据具体化,以便它能够在运行时检查它标志着一个内联函数的类型参数T。

所以,你可以这样做:

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


文章来源: How can I check for generic type in Kotlin