天天看點

kotlin t class.java_如何在Kotlin中擷取泛型參數類

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

}

}