请考虑以下代码段:
public interface MyInterface {
public int getId();
}
public class MyPojo implements MyInterface {
private int id;
public MyPojo(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
public ArrayList<MyInterface> getMyInterfaces() {
ArrayList<MyPojo> myPojos = new ArrayList<MyPojo>(0);
myPojos.add(new MyPojo(0));
myPojos.add(new MyPojo(1));
return (ArrayList<MyInterface>) myPojos;
}
return语句执行不编译的转换。如何将myPojos列表转换为更通用的列表,而无需遍历列表中的每个项目?
由于
答案 0 :(得分:41)
更改方法以使用通配符:
public ArrayList<? extends MyInterface> getMyInterfaces() {
ArrayList<MyPojo> myPojos = new ArrayList<MyPojo>(0);
myPojos.add(new MyPojo(0));
myPojos.add(new MyPojo(1));
return myPojos;
}
这将阻止调用者尝试将接口的其他实现添加到列表中。或者,你可以写:
public ArrayList<MyInterface> getMyInterfaces() {
// Note the change here
ArrayList<MyInterface> myPojos = new ArrayList<MyInterface>(0);
myPojos.add(new MyPojo(0));
myPojos.add(new MyPojo(1));
return myPojos;
}
如评论中所述:
通常最好使用接口而不是返回类型的具体类型。所以建议的签名可能是以下之一:
public List<MyInterface> getMyInterfaces()
public Collection<MyInterface> getMyInterfaces()
public Iterable<MyInterface> getMyInterfaces()
答案 1 :(得分:24)
从一开始就选择正确的类型是最好的,但要回答你的问题,你可以使用类型擦除。
return (ArrayList<MyInterface>) (ArrayList) myPojos;
答案 2 :(得分:4)
你应该这样做:
public ArrayList<MyInterface> getMyInterfaces() {
ArrayList<MyInterface> myPojos = new ArrayList<MyInterface>(0);
myPojos.add(new MyPojo(0));
myPojos.add(new MyPojo(1));
return myPojos;
}
答案 3 :(得分:0)
在这种情况下,我会这样做:
public ArrayList<MyInterface> getMyInterfaces() {
ArrayList<MyInterface> myPojos = new ArrayList<MyInterface>(0);
myPojos.add(new MyPojo(0));
myPojos.add(new MyPojo(1));
return myPojos;
}
MyPojo属于MyInterface类型(因为它实现了接口)。这意味着,您只需使用所需的接口创建List。
答案 4 :(得分:0)
尝试使用除了构造实例之外的所有接口,并且问题将消失:
public List<MyInterface> getMyInterfaces()
{
List<MyInterface> myInterfaces = new ArrayList<MyInterface>(0);
myInterfaces.add(new MyPojo(0));
myInterfaces.add(new MyPojo(1));
return myInterfaces;
}
正如其他人已经说过的,使用MyInterface可以解决您的问题。 对于返回类型和变量,最好使用List接口而不是ArrayList。