从实现类

时间:2017-05-11 18:23:12

标签: java generics reflection type-variables

可以说我在Java中有一些实现名为List<T> Foo的类,用String扩展它,我怎样才能获得List的类型变量(在这个例子中是String)? [在我自己去实施之前要知道,P.S。我相信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

1 个答案:

答案 0 :(得分:0)

您可以使用我的实用程序if (WorkOrderRecord != Guid.Empty),查看here

使用以下方法

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}