2016-05-20 35 views
0

如何投射一個完整的列表而無需在Java中迭代它。 我有這樣的功能:Java如何投射整個列表

private List<Object> getItems (List<Object> list, Pagination pagination) { 

     if (list.size() > pagination.getItemsXPage()) { 

      int init = (pagination.getCurrentPage()-1)* pagination.getItemsXPage(); 
      int end = init + pagination.getItemsXPage(); 

      if (end > list.size()) { 
       end = list.size(); 
      } 

      return list.subList(init, end); 

     } else { 

      return list;       
     }  

    } 

我想這樣做,但它是不可能的?

List<ApplicationSearchItem> applicationSearchItem = (List) getItems (list, searchCriteria.getCategoryProductsPagination()); 
+3

簡答:你不行。長答案:創建一個新的'List '並通過強制轉換逐個複製每個元素。見[這個問題](http://stackoverflow.com/questions/933447/how-do-you-cast-a-list-of-supertypes-to-a-list-of-subtypes)。 – Turing85

回答

4

在這種情況下,你可以使用泛型方法聲明:

現在,你將學會避免試圖用收集<對象初學者的錯誤>作爲集合參數的類型。你可能會也可能沒有認識到使用Collection <? >也不會工作。回想一下,你不能將對象推入未知類型的集合中。

from oracle generic methods tutorial

返回類型由參數列表的類型定義:

private <T> List<T> getItems (List<T> list, Pagination pagination) { 
... 
} 
+1

不相關,但由於該方法不使用任何字段,所以它也應該是「靜態」的。 – Andreas

0

根據您目前的代碼,你要麼必須投每個單獨的對象,或更改的參數你方法從List<Object>到列表<ApplicationSearchItem>避免使用演員。

你不能簡單地施放整個列表的原因是因爲列表僅僅是參考持有者;實際列表僅指向對象類型,並確保只有正確類型的對象位於列表中。在內存本身中,對象仍然獨立於列表而存在,所以無論哪種方式,它們都將被單獨轉換以轉換它們的類型。

通過做什麼dok說(其他答案),你的方法可以接受任何類型的對象,並對它們進行操作。或者,你可以讓它只接受你不需要進行演員表的列表。