请考虑以下代码段:
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 ArrayListgetMyInterfaces() { ArrayList myPojos = new ArrayList (0); myPojos.add(new MyPojo(0)); myPojos.add(new MyPojo(1)); return (ArrayList ) myPojos; }
return语句执行不编译的转换.如何将myPojos列表转换为更通用的列表,而不必遍历列表中的每个项目?
谢谢
更改方法以使用通配符:
public ArrayList extends MyInterface> getMyInterfaces() { ArrayListmyPojos = new ArrayList (0); myPojos.add(new MyPojo(0)); myPojos.add(new MyPojo(1)); return myPojos; }
这将阻止调用者尝试将该接口的其他实现添加到列表中.或者,你可以写:
public ArrayListgetMyInterfaces() { // Note the change here ArrayList myPojos = new ArrayList (0); myPojos.add(new MyPojo(0)); myPojos.add(new MyPojo(1)); return myPojos; }
正如评论中所讨论的:
返回通配符集合对于调用者来说可能很尴尬
通常最好使用接口而不是返回类型的具体类型.所以建议的签名可能是以下之一:
public ListgetMyInterfaces() public Collection getMyInterfaces() public Iterable getMyInterfaces()
从一开始就选择正确的类型是最好的,但是要回答你的问题,你可以使用类型擦除.
return (ArrayList