2

このコードがコンパイルされない理由を理解しようとしています。

インターフェイスAがインターフェイスBによって拡張されています。インターフェイスBを実装するクラスCです。

タイプAの単一のオブジェクトを受け取るメソッドを呼び出すと、タイプCのオブジェクトを渡すことができます。これで問題ありません。

タイプAのjava.util.Listを受け取るメソッドを呼び出すと、タイプCのオブジェクトのjava.util.Listを渡すことができません。Eclipseは次のエラーを生成します。タイプTest1のメソッドaddAList(List)引数には適用されません(リスト)

ソースコードの例を以下に示します。

import java.util.ArrayList;
import java.util.List;

public class Test1 {

    public void addASingle(A a) {
        return;
    }

    public void addAList(List<A> aList) {
        return;
    }

// **********************************

    public static void main(String[] args) {
        Test1 t = new Test1();

        C c1 = new C();
        List<C> cList = new ArrayList<C>();
        cList.add(c1);

        t.addASingle(c1); // allowed

        t.addAList(cList);  // The method addAList(List<Test1.A>)
    // in the type Test1 is not applicable for the arguments (List<Test1.C>)
    }

// **********************************

    public static interface A {
    }

    public static interface B extends A {
    }

    public static class C implements B {
    }
}
4

3 に答える 3

14

AList<Car>はではありませんList<Vehicle>。もしそうなら、あなたは次のことをすることができます:

List<Car> cars = new ArrayList<>();
List<Vehicle> vehicles = cars;
vehicles.add(new Bicycle());

そして、あなたは自転車を含む車のリストになってしまうでしょう。それはジェネリックコレクションの型安全性を台無しにするでしょう。

おそらくのList<? extends A>代わりに使用する必要がありList<A>ます。List<? extends A>意味:List<some class which is A or which extends A>

于 2012-06-28T13:06:44.633 に答える
1

それはリストを期待し、あなたはリストを渡します、

に変更します

public void addAList(List<? extends A> aList) {
        return;
}
于 2012-06-28T13:04:24.610 に答える
0

タイプAのリストが必要です....メソッドシグネチャに書き込んでください。

public void addAList(List<? extends A> aList) {
        return;
    }

これを書くことで、メソッドが A の任意のサブタイプを含む任意のリストを期待することを宣言します..これはワイルドカードと呼ばれます。

于 2012-06-28T13:05:35.580 に答える