ArrayList泛型:菱形

时间:2016-11-15 15:34:04

标签: java

我的问题如下:

我有一个执行器,它在自定义对象的Arraylist上运行一些长时间运行的任务。 我希望能够提供不同类型的执行器Arraylists,每个类型实现一个接口,以便执行者知道如何处理任何兼容的类实例。

 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,然后在提交之前对其进行转换

e.g。

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

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

但请问这是怎么回事?

2 个答案:

答案 0 :(得分:7)

您的Clone方法严格要求其通用类型为submitList的arraylist。这与一般类型为MyInterface的某个子类型的arraylist不同。您可以将其更改为:

MyInterface

指定第一个参数必须是其泛型类型为private void submitList(List<? extends MyInterface> list, ...) 的某个子类型的列表。另外,一般情况下,建议接受MyInterface而不是List作为参数(即program to an interface),因为大多数情况下,您并不关心ArrayList的实现{1}}调用方法时会给你。

答案 1 :(得分:0)

  

当我有一个A类或B类的ArrayList

改为使用List<MyExectorService.MyInterface>

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