Generics Kotlin:泛型、反射以及类型T和T之间的区别:任意

Generics Kotlin:泛型、反射以及类型T和T之间的区别:任意,generics,reflection,kotlin,Generics,Reflection,Kotlin,如果我试图访问泛型类型T的javaClass,Kotlin编译器会抱怨T不是Kotlin的子类型 class Foo<T> (val t: T ){ val cls = t.javaClass // Error, T is not a subtype of kotlin.Any } Foo类(val t:t){ val cls=t.javaClass//Error,t不是kotlin.Any的子类型 } 如果将T定义为任何事物的子类型,则一切正常 class Bar<

如果我试图访问泛型类型T的javaClass,Kotlin编译器会抱怨T不是Kotlin的子类型

class Foo<T> (val t: T ){
    val cls = t.javaClass // Error, T is not a subtype of kotlin.Any
}
Foo类(val t:t){
val cls=t.javaClass//Error,t不是kotlin.Any的子类型
}
如果将T定义为任何事物的子类型,则一切正常

class Bar<T:Any> (val t: T ){
    val cls = t.javaClass // OK
}
类栏(val t:t){
val cls=t.javaClass//OK
}
Q1)如果类型“T”不是“任何”的子类型,那么它可以是哪个类别的子类型

Q2)是否所有T实例都存在javaClass?如果存在,我如何访问它

默认值不是
Any
,而是
Any?

这也意味着从一个可空参数中获取
javaClass
不是空安全的

要从具有
Any?
上限的泛型类型实例中获取
javaClass
,可以将其强制转换为
Any

val cls = (t as Any).javaClass //unsafe
val clsOrNull = (t as? Any)?.javaClass //safe

但有一件事让我困惑,那就是为什么我只需要对泛型类型进行强制转换。对于泛型t
var clsOfT=t?.javaClass
这会给出一个编译错误,但对于常规类型
var a:Any?=“A”;var clsOfA=a?.javaClass
这是可以的,尽管两者都有上界
:Any?
?@tomaskarsson,+1看起来像是Kotlin泛型的一个特性。我将找到答案。对以上内容的澄清:
t
是一个泛型属性
t
@tomaskarsson@hotkey它是已知的限制,因为缺少交叉点类型,即
(t&Any)
。看见