我试图测试在科特林泛型类型。
if (value is Map<String, Any>) { ... }
但是,编译器抱怨
无法检查擦除类型的实例:jet.Map
与普通型的检查效果很好。
if (value is String) { ... }
科特林0.4.68使用。
我缺少的是在这里吗?
我试图测试在科特林泛型类型。
if (value is Map<String, Any>) { ... }
但是,编译器抱怨
无法检查擦除类型的实例:jet.Map
与普通型的检查效果很好。
if (value is String) { ... }
科特林0.4.68使用。
我缺少的是在这里吗?
问题是,类型参数被擦除,所以你不能对证丰满型的地图,因为在运行时没有对这些字符串的任何信息。
要解决此问题,使用通配符:
if (value is Map<*, *>) {...}
JVM删除泛型类型的信息。 但科特林已经物化仿制药。 如果你有一个泛型类型T,你可以根据具体化,以便它能够在运行时检查它标志着一个内联函数的类型参数T。
所以,你可以这样做:
inline fun <reified T> checkType(obj: Object, contract: T) {
if (obj is T) {
// object implements the contract type T
}
}