我正在尝试测试Kotlin中的泛型类型。
if (value is Map<String, Any>) { ... }
但是编译器抱怨说
无法检查已擦除类型的实例: jet.Map
使用普通类型的检查效果很好。
if (value is String) { ... }
使用Kotlin 0.4.68。
这里我漏掉了什么?
发布于 2012-11-01 04:08:50
问题是类型参数被擦除了,所以您无法检查完整的类型映射,因为在运行时没有关于这些字符串和任何字符串的信息。
要解决此问题,请使用通配符:
if (value is Map<*, *>) {...}
发布于 2019-01-16 22:16:38
JVM删除泛型类型信息。但是Kotlin将泛型具体化了。如果你有一个泛型类型T,你可以将内联函数的类型参数T标记为实例化,这样它就能够在运行时检查它。
所以你可以这样做:
inline fun <reified T> checkType(obj: Object, contract: T) {
if (obj is T) {
// object implements the contract type T
}
}
发布于 2019-11-01 18:14:29
我认为这是更合适的方式
inline fun <reified T> tryCast(instance: Any?, block: T.() -> Unit) {
if (instance is T) {
block(instance)
}
}
用法
// myVar is nullable
tryCast<MyType>(myVar) {
// todo with this e.g.
this.canDoSomething()
}
另一种更短的方法
inline fun <reified T> Any?.tryCast(block: T.() -> Unit) {
if (this is T) {
block()
}
}
用法
// myVar is nullable
myVar.tryCast<MyType> {
// todo with this e.g.
this.canDoSomething()
}
https://stackoverflow.com/questions/13154463
复制相似问题