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

时间:2017-09-12 16:05:50

标签: generics kotlin

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

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

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

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

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

3 个答案:

答案 0 :(得分:31)

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

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

答案 1 :(得分:7)

首先,让我们解决它

使通用类型fun <T: Any> test(t: T) { println(t::class) } 不可为空:

Any?

default,上限为Any而不是!!

  

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

附注:您正在使用!!

  

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

使用NullpointerException时,您正在做什么。相反,你告诉编译器:我不希望你检查我的类型的可空性。只需继续并调用该功能。我不怕!! s。

  

“在哪种情况下t !! :: class仍会引起麻烦?”

正如我上面所说,当null被调用的类型实际上是 public static int diff(int n1, int n2){ int sum1=0; int sum2=0; if(n1==0 && n2==0){ return sum1-sum2; } if(n1>n2){ if(n2==0){ sum1++; return diff(n1/10, n2); } sum2++; return diff(n1,n2/10); } if(n1<n2){ if(n1==0){ sum2++; return diff(n1, n2/10); } sum1++; return diff(n1/10,n2); } return 0; } 时,会造成许多麻烦。然后,与在Java中一样,NPE将在运行时抛出。

答案 2 :(得分:4)

您想使用reified类型。您可以详细了解有效的类型参数herehere。代码:

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