我有一个带参数的接口,它有很多不同的实现方式。在运行时,我需要找出给定实现该接口的任意对象的接口实际类型参数是什么。
这里有一段代码片段来说明问题,并试图解决它(也可以在ideone.com上查看):
import java.util.*;
import java.lang.reflect.*;
interface Awesome<X> { }
class Base<E> implements Awesome<Set<E>> { }
class Child extends Base<List<Integer>> { }
class AwesomeExample {
public static void main(String[] args) {
Awesome<Set<List<Integer>>> x = new Child();
System.out.println(
((ParameterizedType)
Child.class.getGenericSuperclass()
).getActualTypeArguments()[0]
);
// prints "java.util.List<java.lang.Integer>"
System.out.println(
((ParameterizedType)
Base.class.getGenericInterfaces()[0]
).getActualTypeArguments()[0]
);
// prints "java.util.Set<E>"
investigate(x);
// we want this to print "Set<List<Integer>>"
}
static void investigate(Awesome<?> somethingAwesome) {
// how to do this?
}
}
看起来在运行时有足够的通用类型信息可以推断出:
Child extends Base<List<Integer>>
Base<E> implements Awesome<Set<E>>
因此我们可以将所有碎片组合在一起得出结论:
Child implements Awesome<Set<List<Integer>>>
所以看起来问题是可以解决的,但这并不简单,因为我们必须处理任意类/接口层次结构。这是唯一的方法吗?是否有更简单的方法?有人已经写了一个库来做这件事吗?