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

dan*_*iol 25 generics kotlin

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

fun <T> test(t: T) {
    t::class
}
Run Code Online (Sandbox Code Playgroud)

这失败了"类文字中的表达式具有可空类型".没关系,我明白了(我可以Any?用作我的Tnull价值).
但是,如果我将其更改t为非null的保证,它仍会失败并显示相同的错误消息:

fun <T> test(t: T) {
    t!!::class
}
Run Code Online (Sandbox Code Playgroud)

在哪种情况下t!!::class还会造成麻烦?
有没有办法在不使用Any(或者转换为Any)的情况下获取类?

Tod*_*odd 45

更改您的类型以表明它不可为空,它应该工作.您可以通过指示T需要扩展Any(而不是Any?)来完成此操作.

fun <T : Any> test(t: T) {
    t::class
}
Run Code Online (Sandbox Code Playgroud)


s1m*_*nw1 9

首先,让我们解决它

使泛型类型T不可为空:

fun <T: Any> test(t: T) {
    println(t::class)
}
Run Code Online (Sandbox Code Playgroud)

通过默认情况下,该上限是Any?不是Any:

"默认上限(如果没有指定)是Any?.只能在尖括号内指定一个上限.如果同一个类型参数需要多个上限,我们需要一个单独的where子句."

旁注:您使用!!不当

"但是如果我把它改为保证t不是空的......"

不是你在使用时所做的!!.相反,你告诉编译器:我不希望你检查我的类型的可空性.只需继续并调用该功能.我不怕NullpointerExceptions.

"在哪种情况下,t !! ::类仍会造成麻烦?"

正如我上面所说的那样,当!!调用的类型实际上是它时会引起许多麻烦null.然后,与Java相同,NPE将在运行时抛出.