2013-07-01 30 views
3

根據我讀過的內容,我認爲這不能完成,但我想確定。 我有一個類OpDTO和其他幾個*DTO extends OpDTO。 然後,我想有一個方法來提取這些孩子的DTO的名單只是某些元素,而在另一個列表返回提取的元素:泛型的集合「不能實例化類型ArrayList <?extends OpDTO>」

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的方法,但它會產生一個編譯錯誤:

Cannot instantiate the type ArrayList<? extends 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; 
} 
+3

**是什麼錯誤說**? – SLaks

+0

無法實例化類型ArrayList <?擴展OpDTO> –

+2

始終在問題中包含錯誤消息。 –

回答

13

List<? extends OpDTO>List<T>一個協變視圖;這意味着只要T匹配,任何List<T>類型都可以轉換爲它。
您不能創建這種類型的實例;您只能將其用作變量或參數類型來保存具體泛型類型的現有實例。

您需要創建一個通用的方法有約束T必須繼承類:

public <T extends OpDTO> List<T> getLastOp (List<T> listDTOs) {