2016-11-15 107 views
0

我的問題,內部接口如下:ArrayList的泛型:鑽石

我有一個運行自定義對象的ArrayList需要長時間運行的任務的執行。 我希望能夠提供不同類類型的執行器Arraylist,每個類都實現一個接口,以便執行器知道如何處理任何兼容的類實例。

class MyExectorService{ 
.... 
     interface MyInterface{ 
      String getData(); 
     } 
} 

class A implements MyExecutor.MyInterface {} .... 
class B implements MyExecutor.MyInterface {} .... 

我的執行者單有一個方法簽名:

public void submitList(ArrayList<MyInterface> list, ....) 

當我有A級或B等的ArrayList我從編譯器錯誤的參數類型的異常。我可以創建一些函數,只是返回一個原始類型的ArrayList,在提交它之前將其轉換爲

例如,

public static ArrayList getRaw(ArrayList list){ 
    return list; 
} 

...MyExecutorService.getInstance().submitList(getRaw(aa /* arraylist of class A /*),...) 

但是請問這樣做的正確方法是什麼?

+6

'私人無效submitList(名單<?延伸MyInterface的>列表,...)' – khelwood

+0

爲 – maturecheese

回答

7

您的submitList方法嚴格地期望其通用類型爲MyInterface的ArrayList。這與通用類型是MyInterface的子類型的數組列表不同。你可以把它改成這樣:

private void submitList(List<? extends MyInterface> list, ...) 

,指定的第一個參數必須是它的通用類型是MyInterface一些亞型的列表。此外,一般建議接受List而不是ArrayList作爲參數(即program to an interface),因爲大部分時間,您不關心List的哪個實現是在調用方法時給出的。

0

當我有類A或B的ArrayList等

使用List<MyExectorService.MyInterface>代替。

List<MyExectorService.MyInterface> l = new ArrayList<>(); 
l.add(new A()); 
l.add(new B());  
submitList(l); 
+0

感謝真棒感謝,是的,但有時名單是由專門的A類,或什麼的,並應爲其他單獨的例程定義。 – maturecheese