泛型集合"无法实例化类型ArrayList <?extends OpDTO>"

Lui*_*Sep 4 java generics

根据我所读到的,我认为这不可能,但我想确定.我有一个班级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;
    }
Run Code Online (Sandbox Code Playgroud)

我希望ult成为与元素相同类型的元素列表listDTOs,并且只使用OpDTO的方法,但它会产生编译错误:

无法实例化该类型 ArrayList<? extends OpDTO>

我也尝试过这样的事情:

public <T> List<T> getLastOp (List<T> listDTOs) {
        List<T> last = new ArrayList<T>();
        //processing

        return last;
    }
Run Code Online (Sandbox Code Playgroud)

但是后来我不能强制listDTOs中的元素成为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;
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 15

List<? extends OpDTO>是一个协变的观点List<T>; 这意味着List<T>只要T匹配,任何类型都可以转换为它.
您无法创建此类型的实例; 您只能将其用作变量或参数类型来保存具体泛型类型的现有实例.

你需要创建一个泛型方法约束T必须继承类:

public <T extends OpDTO> List<T> getLastOp (List<T> listDTOs) {
Run Code Online (Sandbox Code Playgroud)