如何在Java中使用泛型投射列表?

2022-09-01 15:06:29

请考虑以下代码段:

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列表转换为更通用的列表,而不必遍历列表的每个项目

谢谢


答案 1

将方法更改为使用通配符:

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()
    

答案 2

从一开始就选择正确的类型是最好的,但是要回答您的问题,您可以使用类型擦除。

return (ArrayList<MyInterface>) (ArrayList) myPojos;


推荐