【发布时间】:2015-03-11 02:48:22
【问题描述】:
我在获取列表类型时遇到问题。问题是在声明时我没有指定类型。我只在运行时设置它。
我有一个 POJO 类
public class MyObject<T> {
private String name;
private List<T> list;
//getter and setter
}
我已关注this SO question 并尝试了我的以下代码
public class ListType {
public static void main(String[] args) throws NoSuchFieldException, SecurityException {
ListType listType = new ListType();
List<Integer> listInt = new ArrayList<Integer>();
MyObject<Integer> myObjectInt = new MyObject<Integer>();
myObjectInt.setList(listInt);
listType.initialize(myObjectInt);
MyObject<String> myObjectStr = new MyObject<String>();
List<String> listStr = new ArrayList<String>();
myObjectStr.setList(listStr);
listType.initialize(myObjectStr);
}
private void initialize(MyObject myObject) throws NoSuchFieldException, SecurityException {
List list = myObject.getList();
ListType listType = new ListType();
listType.getListType(list);
}
private void getListType(List list) throws NoSuchFieldException, SecurityException {
Field stringListField = MyObject.class.getDeclaredField("list");
ParameterizedType stringListType = (ParameterizedType) stringListField.getGenericType();
Class<?> stringListClass = (Class<?>) stringListType.getActualTypeArguments()[0];
System.out.println(stringListClass);
}
}
然后我得到以下异常
Exception in thread "main" java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
at com.sample.listtype.ListType.getListType(ListType.java:35)
at com.sample.listtype.ListType.initialize(ListType.java:27)
at com.sample.listtype.ListType.main(ListType.java:15)
如果我在运行时设置,如何获取类型?
【问题讨论】:
-
但是如果我在运行时设置,如何获取类型? List 在运行时没有类型 (erasure) 所以这个问题并不真正有道理。最好告诉我们你真正想要做什么。
标签: java generics reflection arraylist