作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
请考虑以下代码段:
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 列表转换为更通用的列表,无需遍历列表中的每个项目?
谢谢
最佳答案
更改您的方法以使用通配符:
public ArrayList<? extends MyInterface> getMyInterfaces() {
ArrayList<MyPojo> myPojos = new ArrayList<MyPojo>(0);
myPojos.add(new MyPojo(0));
myPojos.add(new MyPojo(1));
return myPojos;
}
这将阻止调用者尝试将接口(interface)的其他实现添加到列表中。或者,您可以只写:
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;
}
正如评论中所讨论的:
通常最好使用接口(interface)而不是返回类型的具体类型。所以建议的签名可能是以下之一:
public List<MyInterface> getMyInterfaces()
public Collection<MyInterface> getMyInterfaces()
public Iterable<MyInterface> getMyInterfaces()
关于java - 如何在 Java 中使用泛型转换列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/662508/
我是一名优秀的程序员,十分优秀!