首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Kotlin中检查泛型类型

如何在Kotlin中检查泛型类型
EN

Stack Overflow用户
提问于 2012-10-31 17:07:47
回答 5查看 37.7K关注 0票数 93

我正在尝试测试Kotlin中的泛型类型。

代码语言:javascript
复制
if (value is Map<String, Any>) { ... }

但是编译器抱怨说

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

使用普通类型的检查效果很好。

代码语言:javascript
复制
if (value is String) { ... }

使用Kotlin 0.4.68。

这里我漏掉了什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-11-01 04:08:50

问题是类型参数被擦除了,所以您无法检查完整的类型映射,因为在运行时没有关于这些字符串和任何字符串的信息。

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

代码语言:javascript
复制
if (value is Map<*, *>) {...}
票数 102
EN

Stack Overflow用户

发布于 2019-01-16 22:16:38

JVM删除泛型类型信息。但是Kotlin将泛型具体化了。如果你有一个泛型类型T,你可以将内联函数的类型参数T标记为实例化,这样它就能够在运行时检查它。

所以你可以这样做:

代码语言:javascript
复制
inline fun <reified T> checkType(obj: Object, contract: T) {
  if (obj is T) {
    // object implements the contract type T
  }
}
票数 20
EN

Stack Overflow用户

发布于 2019-11-01 18:14:29

我认为这是更合适的方式

代码语言:javascript
复制
inline fun <reified T> tryCast(instance: Any?, block: T.() -> Unit) {
    if (instance is T) {
        block(instance)
    }
}

用法

代码语言:javascript
复制
// myVar is nullable
tryCast<MyType>(myVar) {
    // todo with this e.g.
    this.canDoSomething()
}

另一种更短的方法

代码语言:javascript
复制
inline fun <reified T> Any?.tryCast(block: T.() -> Unit) {
    if (this is T) {
        block()
    }
}

用法

代码语言:javascript
复制
// myVar is nullable
myVar.tryCast<MyType> {
    // todo with this e.g.
    this.canDoSomething()
}
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13154463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档