generics集合“无法实例化类型ArrayList “
根据我所读到的,我认为这不可能,但我想确定。 我有一个OpDTO
类和其他几个*DTO extends OpDTO
。 然后,我想要一个方法从这些子DTO的列表中提取某些元素,并将提取的元素返回到另一个列表中:
public List getLastOp (List listDTOs) { List last = new ArrayList(); //compile error: Cannot instantiate the type ArrayList //processing return last; }
我希望ult
是与ult
中元素相同类型的元素listDTOs
,并且只使用OpDTO的方法,但它会产生编译错误:
无法实例化类型
ArrayList
ArrayList
我也尝试过这样的事情:
public List getLastOp (List listDTOs) { List last = new ArrayList(); //processing return last; }
但是后来我不能强制listDTOs中的元素成为OpDTO的子类,并且无法实例化T.任何想法?
编辑
我也发生了将类型作为参数传递,然后我可以实例化它。 那可以,还是某种不好的做法?
private List getLastOp (List listDTOs, Class clazz) { List ult = new ArrayList(); //processing OpDTO op = clazz.newInstance(); //processing ult.add((T) op); op = listDTOs.get(i); return ult; }
List extends OpDTO>
List extends OpDTO>
是List
的协变视图; 这意味着只要T
匹配,任何List
类型都可以转换为它。
您无法创建此类型的实例; 您只能将其用作变量或参数类型来保存具体generics类型的现有实例。
您需要使用T
必须inheritance您的类的约束创建generics方法:
public List getLastOp (List listDTOs) {