2016-11-15 90 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