1

パラメータ化されたコレクションで、パラメータ化されたタイプのサブタイプを使用する場合は、コレクションを次のように宣言する必要があることを理解しています。Collection<? extends Whatever>

例えば:

public interface Fruit {}
public interface Banana extends Fruit {}

void thisWorksFine() {
  //Collection<Fruit> fruits;          //wrong
  Collection<? extends Fruit> fruits;  //right
  Collection<Banana> bananas = new ArrayList<>();
  fruits = bananas;
}

しかし、レイヤーを追加すると、次のようになります。

public interface Box<T> {}

void thisDoesNotCompile() {
    Collection<Box<? extends Fruit>> boxes;
    Collection<Box<Banana>> bananaBoxes = new ArrayList<>();
    boxes = bananaBoxes;  // error!
}

エラーあり:

error: incompatible types
required: Collection<Box<? extends Fruit>>
found:    Collection<Box<Banana>>

なぜこれらは互換性がないのですか?これを機能させる方法はありますか?

4

1 に答える 1

4

にを追加できるためBox<Apple>boxesの整合性に違反しますbananaBoxes

public interface Apple extends Fruit {}

//...

Box<Apple> apples = new Box<>(); // this is legal
Box<? extends Fruit> fruits = apples; // this is legal

Collection<Box<Banana>> bananaBoxes = new ArrayList<>(); 

Collection<Box<? extends Fruit>> boxes = bananaBoxes; //if this were legal...
boxes.add(fruits); //then this would be legal

//and this would be a type violation:
Box<Banana> bananas = bananaBoxes.iterator().next(); 

代わりに行うことができます

Collection<? extends Box<? extends Fruit>> boxes = bananaBoxes;

上記のケースを防ぐので合法です。

于 2012-10-22T18:47:36.290 に答える