Подтвердить что ты не робот

Kotlin: Дженерики, отражение и различие между типами T и T: Любые

Если я попытаюсь получить доступ к javaClass общего типа T, компилятор Kotlin жалуется, что T не является подтипом kotlin.Any

class Foo<T> (val t: T ){
    val cls = t.javaClass // Error, T is not a subtype of kotlin.Any
}

Если определить T как подтип Any, все работает нормально.

class Bar<T:Any> (val t: T ){
    val cls = t.javaClass // OK
}

Q1) Если тип'T 'не является подтипом "Any", какой класс/классы может быть подтипом?

Q2) Существует ли javaClass для всех экземпляров T, и если да, то каким образом я могу получить к нему доступ?

4b9b3361

Ответ 1

По умолчанию общая верхняя граница не Any, а Any?.

Это также означает, что он не имеет нулевого значения, чтобы получить javaClass из аргумента с нулевым значением.

Чтобы получить javaClass из экземпляра типового типа с верхней границей Any?, вы можете применить его к Any:

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