本来想用反射试试的,发现不行,Class.getTypeParameters得到的是T,查阅了文章才知道:Java编译器在编译的时候,同时生成针对擦除类型和泛化类型的两套字节码,而在运行时,JVM只使用擦除类型的字节码,泛化类型的字节码仅仅被用于反射! (引用自:http://tech.it168.com/j/2007-03-02/200703021013218_4.shtml)。所以不能在运行时动态的得到对象的类型化列表。不过也可以选择其他不太优雅的方式,比如:
public class Test <T>{
private Class type;
public Test1(Class type){
this.type = type;
}
public void print(){
System.out.println(type.getCanonicalName());
}
public static void main(String[] args) {
Test<String> t1 = new Test<String>(String.class);
t1.print();
Test<Integer> t2 = new Test<Integer>(Integer.class);
t2.print();
}
}
//out put
java.lang.String
java.lang.Object
也可是这样:
public class Test<T> {
List<T> lists = new ArrayList<T>();
public void add(T t){
lists.add(t);
System.out.println(t.getClass().getCanonicalName());
}
public static void main(String[] args) {
Test<String> t1 = new Test<String>();
t1.add("aaaaa");
Test<Integer> t2 = new Test<Integer>();
t2.add(new Integer(1));
}
}
//out put
java.lang.String
java.lang.Object