为什么我不能获得泛型参数的类?
我有一个函数,它采用泛型类型的一个参数,我想访问它的类:
fun <T> test(t: T) { t::class }
这失败了,“类中的表达式具有可空类型”。 没关系,我明白了(我可以使用Any?
作为我的T
和null
作为值)。
但是,如果我改变它来保证t
不是null,它仍然会失败,同样的错误信息:
fun <T> test(t: T) { t!!::class }
在这种情况下, t!!::class
还是会造成麻烦?
有没有办法让班级不使用任何(或铸造任何)?
改变你的类型,以表明它是不可空的,它应该工作。 你可以通过指出T
需要扩展Any
(而不是Any?
)来做到这一点。
fun <T : Any> test(t: T) { t::class }
你想使用reified
类型。 您可以在这里或这里了解更多关于实体类型参数的信息 。 代码:
inline fun <reified T : Any> test(t: T) { println(T::class) }
你没用!!
正确地
“但是,如果我改变它来保证t不是零…”
这不是你使用时正在做的!!
。 相反,你对编译器说:“我不希望你检查我的类型是否为空,只要继续调用这个函数,我不怕NullpointerException
。
“在这种情况下,还是会出现麻烦?”
正如我上面所说,这种类型造成了很多麻烦!!
被调用,IS实际上是null
。 然后,和Java一样,NPE将在运行时抛出。
如何解决你的代码
正如已经建议的那样,使泛型T
不可空:
fun <T: Any> test(t: T) { println(t::class) }
默认情况下 ,上限是Any?
而不是Any
:
默认的上限(如果没有指定)是Any?,只能在尖括号内指定一个上限,如果同一个类型的参数需要多个上限,我们需要一个单独的where子句。