本文介绍了如何获得Kotlin中实际泛型参数的实际类型参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
使用,可以编写一个内联函数在运行时通过反射类型参数:
inline fun< reified T:Any val clazz = T :: class
// ...
}
但是当 f用本身是泛型类的参数调用时,似乎没有办法通过
T :: class
:
f< List< Integer
有没有办法让实际通过反射类型化泛化泛型的参数?
解决方案
由于,实际泛型参数不能通过 T :: class
通用类的标记获得。不同类型的对象必须具有相同的类标记,这就是为什么它不能包含实际的泛型参数。
但有一个叫做,它可以在编译时已知类型的情况下给出实际的类型参数(对于Kotlin中的泛化泛型而言,这是因为内联)。
诀窍是编译器保留了从泛型类派生的非泛型类的实际类型参数(它的所有实例都会有相同的参数,很好的解释)。它们可以通过 Class <*实例的
clazz.genericSuperClass.actualTypeArguments
访问。
给出所有这些,你可以这样编写一个util类:
abstract class TypeReference< T val type:Type =
(javaClass.genericSuperclass as ParameterizedType).actualTypeArguments [0]
override fun compareTo(other:TypeReference< T}
After that, in an inline function with a reified generic, TypeReference
needs to be subclassed (an object expression will go), and then its type
can be used.
Example:
inline fun <reified T: Any
printGenerics<HashMap<Int, List<String:
这篇关于如何获得Kotlin中实际泛型参数的实际类型参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!