對于具有泛型參數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)
}
}