パラメータ化されたコレクションで、パラメータ化されたタイプのサブタイプを使用する場合は、コレクションを次のように宣言する必要があることを理解しています。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>>
なぜこれらは互換性がないのですか?これを機能させる方法はありますか?