3

質問 1: 与えられた:

  List<Object> lo = new ArrayList<Object>();

私の理解が正しければ、 のパラメーターは でArrayList<>()なければならないのでObject、それを記述する必要がありますか? または、次のようにスキップします。

List<Object> lo = new ArrayList<>();   

質問 2: 与えられた:

List<? extends Animal> myArray = new ArrayList<Dog>();  

=私が理解しているように、 meansの左側は型myArrayの参照であり、 or , .... の右側についてはどうですか?それはどういう意味ですか? のみを含む実際のオブジェクトに参照が割り当てられているということですか? はいの場合、右側の情報が役立つ、または必要な状況について考えることができません。例を教えてくださいListList<Cat>List<Dog>=myArrayListDog=

     ... = new ArrayList<Dog>();  

不可欠または少なくとも有用ですか?

4

4 に答える 4

2

Q1: Java 7 ではスキップできます。

Q2:この宣言はあまり意味がありません。List<? extends SomeClass>開発者が SomeClass を拡張するものを含むすべての種類のリストを渡すことができるようにするために、メソッドの引数として役立ちます。ただし、そのリストに何かを追加することは禁止されています。

public void addAnimal(List<? extends Animal> animals) {
      animals.add(new Dog()); // Compiler error
}

それを実現したい場合は、 super キーワードを使用する必要がありますList<? super SomeClass>

以下も参照してください。

于 2013-04-28T05:50:22.230 に答える
2

First question: Java 7 introduces the diamond operator, which acts as syntactic sugar for writing out the full types of generics in most cases. It can be omitted, but it's "still there".

Second question:

  • The left side is a list that is an upper-bounded generic wildcard. It contains any object that either extends or implements a class named Animal. You won't be able to insert any values into that list unless the list is defined instead as a lower-bounded generic wildcard (using the super keyword). There's a fair bit more on how to use them, when to use them, and how to categorize them in this Java Trail.

  • The right side is a bit unusual to be dangling there, but it can be used to assign to an upper-bound generic type list, if you populate the list you want first.

    List<? extends Animal> fooList = new ArrayList<>();
    List<Dog> barList = new ArrayList<>();
    barList.add(new Dog());
    barList.add(new Dog());
    barList.add(new Dog());
    barList.add(new Dog());
    
    fooList = barList;
    

    You would still have to iterate over it as the upper-bound generic type:

    for(Animal d : fooList) {
        d.walk();
        d.talk();
    }
    

Essentially, the way you have it now is both misleading and not helpful, since that new ArrayList<Dog> is empty, and can't be added to.

于 2013-04-28T06:10:11.060 に答える