我想结合两个通用列表并希望生成新列表,我以简单的格式提供我的代码。
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
}
}
我的要求是我应该能够组合两个整数和长列表来生成数字列表,我也应该能够组合其他类型。 这里的问题是关于我尝试组合整数和长列表时的返回类型。我需要做些什么改变才能使我的代码工作。
答案 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);
}