我有一個參數化的接口,以許多不同的方式實現。在運行時,我需要弄清楚,給定一個實現該接口的任意對象,接口的實際類型參數是什麼。如何獲得間接實現的通用接口的實際類型參數?
下面就來說明問題的一個片段,並且中途試圖解決它(also on 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>>>
所以看起來這個問題是可以解決的,但它不是那麼簡單,因爲我們不得不使用任意的類/接口層次結構。這是做到這一點的唯一方法嗎?有一種更簡單的方法嗎?有人寫過一個圖書館來做到這一點嗎?
我不知道實現這個庫。我自己做了 - 這不是很愉快。我至少可以找到超類型令牌實現:http://code.google.com/p/google-gson/source/browse/trunk/src/main/java/com/google/gson/reflect/TypeToken.java ?r = 60&spec = svn89 – 2010-12-23 09:17:52