3

2 つの一般的なリストを結合し、新しいリストを作成したいので、コードを単純な形式で提供しています。

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

私の要件は、2 つの整数リストと長いリストを組み合わせて数値リストを生成できる必要があり、他のタイプも組み合わせることができる必要があるということです。ここでの問題は、整数と長いリストを組み合わせようとしているときの戻り値の型に関するものです。コードを機能させるには、どのような変更を加える必要がありますか。

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);、それはうまくいくはずです

何かを提案できる場合は、リストを generic として作成して、List<E> es= new ArrayList<E>();返す前にキャストする必要がないようにします

于 2013-08-07T08:12:28.090 に答える
1

2 つの方法があります。

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

コンパイラが解決すべき有効な型を見つけられない場合がありますが、あなたは彼を助けることができます

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

これをしたくない場合は、そうしてください

List<? extends Number> union = Example.union(intList, longList);
于 2013-08-07T08:19:22.997 に答える
-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);
}

これは Union 内で、発生するリストの共通要素と珍しい要素の両方を保持する必要があります。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 に答える