为什么我不能获得泛型参数的类?

我有一个函数,它采用泛型类型的一个参数,我想访问它的类:

fun <T> test(t: T) { t::class } 

这失败了,“类中的表达式具有可空类型”。 没关系,我明白了(我可以使用Any?作为我的Tnull作为值)。
但是,如果我改变它来保证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子句。