java - 从实现类中获取类型参数的类

标签 java generics reflection type-variables

假设我有一些 Java 类实现 List<T>Foo将其扩展为 String ,如何获取 List 的类型变量(本例中是 String )? [只是在我自己实现之前知道,P.S.我确信 springframework 可以做到这一点]

注意,可以这样做,因为 Foo类元数据包含通用父类(super class)和接口(interface),与想要了解 new LinkedList<String>() 内部的类型不同。

注意使用 ((ParameterizedType)Foo.class.getGenericSuperClass()).getActualTypeArguments()[0]不足以满足我的需求(请参阅下面的代码: FooBar )

显示我想要的代码:

// java.util: interface List<T> { }

interface TypeList<A, T> extends List<T> { }

interface Foo extends List<String> { }

interface Bar extends TypeList<Integer, Long> { }

Class<?> getTypeParameter(Class<?> fromClass, Class<?> superTypeWithTypeVariables, int indexOfTypeVariable) {
    // ...
}

// Foo -> List<String> -> List<E> -> E is #0
assertEquals(String.class, getTypeParameter(Foo.class, List.class, 0))
// Bar -> TypeList<..., Long> -> TypeList<..., T> -> List<T> -> List<E> -> E is #0
assertEquals(Long.class, getTypeParameter(Bar.class, List.class, 0))

实现需要遍历所有类层次结构并使用 ParameterizedType 和 TypeVariable 接口(interface)以及其他一些人员。

但是这个问题是题外话,因为我问什么库实现了这个(参见 https://stackoverflow.com/help/on-topic )

最佳答案

您可以使用我的实用程序GenericUtil,查看它 here .

使用以下方法

public static Type[] getGenericTypes(Type sourceType, Class<?> targetClass)

它可以推断任何泛型类型,即使它不是显式的。

在你的情况下你可以这样做

getGenericTypes(Foo.class, List.class) // {String.class}
getGenericTypes(Bar.class, List.class) // {Long.class}
getGenericTypes(Bar.class, TypeList.class) // {Integer.class, Long.class}

即使你也能做到

interface Baz<T> extends TypeList<T, Long> {}
getGenericTypes(Baz.class, List.class) // {Long.class}
getGenericTypes(Baz.class, TypeList.class) // {T, Long.class}

关于java - 从实现类中获取类型参数的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43922989/

相关文章:

java - 将 Eclipse 中的多个文件夹分别导入一个项目

java - 更改 apachee POI 中的 getROW 索引抛出 NullPointerException

java - 如何处理获取相同文件的两个扫描仪

java - 实例化一个类并在不同的 JVM 中运行它的方法

reflection - 在scala中通过字符串名称获取对象实例

java - 我正在学习Head First Java,但我看不懂第544页

c# - 类型转换泛型

c# - 泛型的底层实现

java - 是否可以打包通用类?

java - 截至 2.11 版本,scala 反射功能(尤其是 wrt 注释)的(当前)状态如何?