从实现类获取类型参数的类



假设我在 Java 中有一些类实现了名为 FooList<T>,它用 String 扩展它,我如何获取List的类型变量(在本例中是String(?[只是为了在我自己去实施之前知道,附言我相信 springframework 可以做到这一点]

请注意,这可以完成Foo因为类元数据包含泛型超类和接口,并且与想知道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 接口以及其他一些工作人员。

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

您可以使用我的实用程序GenericUtil,请在此处查看。

使用以下方法

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}

最新更新