首页 文章

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

提问于
浏览
13

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

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

这与"expression in class literal has nullable type"失败 . 没关系,我明白了(我可以使用 Any? 作为我的 Tnull 作为值) .
但是,如果我将其更改为保证 t 不为null,它仍会失败并显示相同的错误消息:

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

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

3 回答

  • 3

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

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

    首先,让我们解决它

    使泛型类型 T 不可为空:

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

    通过default,上限是 Any? 而不是 Any

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

    旁注:你正在使用!!不正确

    “但如果我把它改为保证t不为空......”

    这不是你在使用 !! 时所做的 . 相反,你告诉编译器:我不要害怕 NullpointerException .

    “在哪种情况下,t !! :: class仍会造成麻烦?”

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

  • 7

    您想使用 reified 类型 . 您可以了解有关已知类型参数herehere的详细信息 . 代码:

    inline fun <reified T : Any> test(t: T) {
        println(T::class)
    }
    

相关问题