对于具有泛型参数T的类,您无法执行此操作,因为您没有T的类型信息,因为JVM会删除类型信息 . 因此这样的代码不起作用:
class Storage {
val snapshot: Snapshot? = ...
fun retrieveSomething(): T? {
return snapshot?.getValue(T::class.java) // ERROR "only classes can be used..."
}
}
但是,如果T的类型被内联并在内联函数中使用,则可以使其工作:
class Storage {
val snapshot: Snapshot? = ...
inline fun retrieveSomething(): T? {
return snapshot?.getValue(T::class.java)
}
}
请注意,如果public,则内联函数只能访问该类的公共成员 . 但是你可以有两个函数变体,一个接收不是内联的类参数并访问私有内部,另一个内联辅助函数根据推断的类型参数进行相关:
class Storage {
private val snapshot: Snapshot? = ...
fun retrieveSomething(ofClass: Class): T? {
return snapshot?.getValue(ofClass)
}
inline fun retrieveSomething(): T? {
return retrieveSomething(T::class.java)
}
}
您也可以使用 KClass 而不是 Class ,这样只有Kotlin的调用者可以使用 MyClass::class 而不是 MyClass::class.java
如果您希望该类与泛型上的内联方法配合使用(意味着类 Storage 仅存储 T 类型的对象):
class Storage {
val snapshot: Snapshot? = ...
inline fun retrieveSomething(): R? {
return snapshot?.getValue(R::class.java)
}
}