4

これら2つのsの間に違いはありListますか?

List<Something> a;
List<? extends Something> b;

たとえば

List<Object> a;
List<?> b;
List c;

List<Something> a;
List<? extends SomeInterfaceSomethingImplements> b;

全部違いますが、こちらはいかがですか?Somethingと置き換えられた場合、それは異なりObjectますか?

List<Object> a;
List<? extends Object> b;
4

4 に答える 4

10

List<Something>タイプ のオブジェクトのリストですSomethingList<? extends Something>を拡張する特定のタイプのオブジェクトのリストですSomething

したがって、は、List<Object>を拡張する任意のクラスのオブジェクトを持つことができますObject。ただしList<? extends Object>、拡張する特定のクラスのオブジェクトのリストとしてのみ初期化または割り当てできますObject

これはいつ役に立ちますか?Listofを受け取り、Objects各アイテムを出力するメソッドを書きたいとします。

void print(List<Object> list) {
    for (Object obj: list) {
        System.out.println(obj)
    }
}

さて、あなたが持っているとしましょうList<Integer>printを受け取りList<Object>List<Integer>に代入できないため、上記のメソッドに渡すことはできませんList<Object>。これを回避するために、次のように再定義printします。

void print2(List<? extends Object> list) {
    for (Object obj: list) {
        System.out.println(obj)
    }
}

これで、 Object の任意のサブクラスの List を に渡すことができますprint2。等でprint2承ります。List<Integer>List<String>

逆に、はどの具体的なサブタイプが使用されているかわからないprint2ため、内のリストには何も追加できません。したがって、に何も追加する必要がないメソッドでのみ使用できます。print2Object? extends ...List

于 2013-09-21T17:56:33.770 に答える
2

他の人が述べたように、List<Something>は type のオブジェクトのリストですが、オブジェクト タイプがSomethingextendsList<? extends Something>である限り、異なるオブジェクト タイプのリストに初期化されますSomething

List<Object>タイプ のオブジェクトのリストになりますObject

List<? extends Object>拡張する任意のデータ型のリストになるように初期化できますObject

Objectと比較して使用したときに何が起こるかを示すコードを次に示します? extends Object

import java.util.ArrayList;

public class test {
    class A {}

    public static void main(String[] args) {
        // No error
        ArrayList<Object> arrObj = new ArrayList<Object>();

        // Error
        ArrayList<Object> arrObj2 = new ArrayList<A>();

        // No Error
        ArrayList<? extends Object> arrExt = new ArrayList<Object>();

        // No Error
        ArrayList<? extends Object> arrExt2 = new ArrayList<A>();
    }

}
于 2013-09-21T17:59:33.717 に答える
1

List<Something>は、実装が のようなものであることを意味しますArrayList<Something>。しかし、それ以外の場合List<? extends Something>は、実装がのようなものArrayList<Something>またはArrayList<SomethingChild>where SomethingChildextendsになる可能性があることを意味しますSomething

割り当てることができます

List<? extends Something> list = new ArrayList<SomethingChild>();

一方、割り当てることはできません

List<Something> list = new ArrayList<SomethingChild>();

これはコンパイルエラーになります。

ジェネリックとジェネリックで使用されるワイルドカードについて詳しく知ることができます。

于 2013-09-21T17:56:53.647 に答える