4

根据我所读到的,我认为这是不可能的,但我想确定一下。我有一堂课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 的方法,但它会产生编译错误:

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

我也尝试做类似的事情:

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

        return last;
    }

但是我不能强制 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;
}
4

1 回答 1

15

List<? extends OpDTO>是 的协变List<T>视图 这意味着List<T>只要T匹配,任何类型都可以转换为它。
你不能创建这种类型的实例;您只能将其用作变量或参数类型来保存具体泛型类型的现有实例。

您需要创建一个具有必须继承您的类的约束的泛型方法:T

public <T extends OpDTO> List<T> getLastOp (List<T> listDTOs) {
于 2013-07-01T16:58:18.010 回答