Combinig两个通用列表

Kru*_*hna 2 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Niz*_*ziL 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;
    }
Run Code Online (Sandbox Code Playgroud)

并像这样使用它

List<? extends Number> list = union(a, b);
Run Code Online (Sandbox Code Playgroud)

  • 您应该使用addAll,因为可以通过Collection的子类覆盖addAll以改进add all进程.例如,查看java.util.ArrayList.addAll().它确实通过使用System.arraycopy()添加所有元素.如果两个集合都是ArrayLists,则速度非常快,例如arrayList1.addAll(arrayList2).因此,addAll不仅仅是对集合的简单迭代,而是将元素添加到另一个集合中.+1为你的答案 (2认同)