我的问题如下:
我有一个执行器,它在自定义对象的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 /*),...)
但请问这是怎么回事?
答案 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);