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)

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值