如何获得Kotlin中实际泛型参数的实际类型参数

如何获得Kotlin中实际泛型参数的实际类型参数

本文介绍了如何获得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中实际泛型参数的实际类型参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-14 04:16