结合两个通用List

时间:2013-08-07 07:59:48

标签: java generics collections

我想结合两个通用列表并希望生成新列表,我以简单的格式提供我的代码。

public class Example{
    public static <E> List<E> union(List<? extends E> a,List<? extends E> b){
        List<Object> es= new ArrayList<Object>();
        for( E e:a){
            es.add(e);
        }
        for( E e:b){
            es.add(e);
        }
        return (List<E>) es;
    }

    public static void main(String[] args) {
        List<Long> a=new ArrayList<Long>();
        a.add(1L);

        List<Integer> b=new ArrayList<Integer>();
        b.add(2);

        List<Number> list3=union(a, b);//Compilation Error due to mismatch of return type

        List<String> a1=new ArrayList<String>();
        a1.add("H");
        List<String> a2=new ArrayList<String>();
        a1.add("=E");

        List<String> a3=union(a1, a2);//no compilation error
    }
}

我的要求是我应该能够组合两个整数和长列表来生成数字列表,我也应该能够组合其他类型。 这里的问题是关于我尝试组合整数和长列表时的返回类型。我需要做些什么改变才能使我的代码工作。

6 个答案:

答案 0 :(得分:7)

为什么不使用addAll

   public static <E> List<E> union(List<? extends E> a,List<? extends E> b){
        List<E> es= new ArrayList<E>();
        es.addAll(a);
        es.addAll(b);
        return es;
    }

并像这样使用

List<? extends Number> list = union(a, b);

答案 1 :(得分:4)

将您的List<Number> list3=union(a, b);更改为List<? extends Number> list3=union(a, b);,这应该有效

如果我可以提出建议,请将您的列表创建为通用List<E> es= new ArrayList<E>();,这样您就不必在返回之前将其强制转换

答案 2 :(得分:1)

案例是编译器找不到要解析的有效类型,但你可以帮助他

List<Number> union = Example.<Number>union(intList, longList);

如果您不想这样做,只需执行

List<? extends Number> union = Example.union(intList, longList);

答案 3 :(得分:1)

我看到两种方式:

1)

List<Number> list3 = Example.<Number>union(a, b);

2)

List<? extends Number> list3 = union(a, b); //You can't add more objects to this list

答案 4 :(得分:-1)

public static List<Number> union(List<? extends Number> a, List<? extends Number> b) {

    List<Number> es = new ArrayList<Number>();
    for (Number e : a) {
        es.add(e);
    }
    for (Number e : b) {
        es.add(e);
    }
    return es;
}

答案 5 :(得分:-1)

试试这个:

public static <E> List<? extends E> union(List<? extends E> a, List<? extends E> b) {
    HashSet<E> set = new HashSet<E>();
    set.addAll(a);
    set.addAll(b);
    return new ArrayList<E>(set);
}

在联盟中,它需要保持列表中的公共元素和非常见元素。 HashSet拥有独特的元素。

测试:

public static void main(String... a) {
    List<Integer> l1 = new ArrayList<Integer>();
    l1.add(Integer.valueOf(0));

    List<Long> l2 = new ArrayList<Long>();
    l2.add(Long.valueOf(1));

    List<? extends Number> l3 = union(l1,l2);
    System.out.println(l3);
}