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