当前位置:  开发笔记 > 编程语言 > 正文

如何在Java中使用泛型来转换列表?

如何解决《如何在Java中使用泛型来转换列表?》经验,为你挑选了2个好方法。

请考虑以下代码段:

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

    ArrayList myPojos = new ArrayList(0);
    myPojos.add(new MyPojo(0));
    myPojos.add(new MyPojo(1));

    return (ArrayList) myPojos;
}

return语句执行不编译的转换.如何将myPojos列表转换为更通用的列表,而不必遍历列表中的每个项目

谢谢



1> Jon Skeet..:

更改方法以使用通配符:

public ArrayList getMyInterfaces() {    
    ArrayList myPojos = new ArrayList(0);
    myPojos.add(new MyPojo(0));
    myPojos.add(new MyPojo(1));

    return myPojos;
}

这将阻止调用者尝试将该接口的其他实现添加到列表中.或者,你可以写:

public ArrayList getMyInterfaces() {
    // Note the change here
    ArrayList myPojos = new ArrayList(0);
    myPojos.add(new MyPojo(0));
    myPojos.add(new MyPojo(1));

    return myPojos;
}

正如评论中所讨论的:

返回通配符集合对于调用者来说可能很尴尬

通常最好使用接口而不是返回类型的具体类型.所以建议的签名可能是以下之一:

public List getMyInterfaces()
public Collection getMyInterfaces()
public Iterable getMyInterfaces()



2> Peter Lawrey..:

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

return (ArrayList) (ArrayList) myPojos;


IMO,这应该是答案,因为在某些情况下,你根本无法将项添加到基类型的集合中:从查询中想到JPA结果集,你有一个JPA实体列表,如果你想返回这个列表给调用者使用实体上面的一些抽象接口(持久性不可知),Peter的建议是*the*way
推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有