3

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

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
    }
}

我的要求是我应该能够结合两个整数和长列表来生成一个数字列表,并且我应该能够结合其他类型。问题在于当我尝试组合整数和长列表时的返回类型。我需要进行哪些更改才能使我的代码正常工作。

4

6 回答 6

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);
于 2013-08-07T08:13:13.783 回答
4

改变你List<Number> list3=union(a, b);List<? extends Number> list3=union(a, b);,这应该工作

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

于 2013-08-07T08:12:28.090 回答
1

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

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

如果您不想这样做,请执行

List<? extends Number> union = Example.union(intList, longList);
于 2013-08-07T08:19:22.997 回答
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
于 2013-08-07T08:21:32.957 回答
-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;
}
于 2013-08-07T08:06:28.150 回答
-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);
}
于 2013-08-07T08:11:01.300 回答