根据我读到的内容,我认为这是不可能的,但我想确定一下。
我有课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;
}
I want ult
是与中的元素同类的元素列表listDTOs
,并且仅使用 OpDTO 的方法,但它会产生编译错误:
无法实例化类型ArrayList<? extends OpDTO>
我也尝试做类似的事情:
public <T> List<T> getLastOp (List<T> listDTOs) {
List<T> last = new ArrayList<T>();
//processing
return last;
}
但是我无法强制 listDTOs 中的元素成为 OpDTO 的子类,并且无法实例化 T。
任何想法?
EDIT
我还想到将类型作为参数传递,然后我可以实例化它。这样可以吗?还是某种不好的做法?
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>
;这意味着任何List<T>
类型可以转换为它,只要T
火柴。
您无法创建此类类型的实例;您只能将其用作变量或参数类型来保存具体泛型类型的现有实例。
您需要创建一个通用方法约束 that T
必须继承你的类:
public <T extends OpDTO> List<T> getLastOp (List<T> listDTOs) {
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)