我有一个函数,它接受泛型类型的一个参数,我想访问它的类:
fun <T> test(t: T) {
t::class
}
这失败,“class literal中的表达式具有可空类型”。没关系,我明白了(我可以使用Any?
作为我的T
和null
作为值)。
但是,如果我将其更改为保证t
不为null,它仍然会失败,并显示相同的错误消息:
fun <T> test(t: T) {
t!!::class
}
在哪种情况下,t!!::class
仍会造成麻烦?
有没有办法在不使用Any(或者转换为Any)的情况下获得类?
答案 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)