私の質問は、Java 7には約ジェネリック医薬品は、我々はそのようなクラス階層があるとしている。ジェネリックスのワイルドカード: "?super T"は "?extends T"は動作しませんか?
interface Animal {}
class Lion implements Animal {}
class Butterfly implements Animal {}
にも、我々はクラスを持っているだけのように
class Cage<T> {
private List<T> arr = new ArrayList<>();
public void add(T t) {
arr.add(t);
}
public T get() {
return arr.get(0);
}
}
そして、ここではコードですそのクラスを使用する:
public static void main(String[] args) {
Cage<? extends Animal> cage = new Cage<>();
Animal a = cage.get(); //OK
cage.add(new Lion()); //Compile-time error
cage.add(new Butterfly()); //Compile-time error
}
質問#1:
私はこれらの問題についてhereと読みましたが、単純にCage<?>
のようでした。しかし、私はコンパイラに<? extends Animal>
と言うので、タイプT
にCage<T>
は動物型のいずれかのサブタイプになります。それではなぜコンパイル時にエラーが出るのですか?
質問#2:
私はすべてが正常に動作し、コンパイラが悪い何も言っていないCage<? super Animal> cage = ...
代わりCage<? extends Animal> cage = ...
のを指定した場合。なぜ上の例では失敗するのですか?
とcage.add(新しいLion())もコンパイルされません。 – maks
固定ありがとうございます。 –
Javaのチュートリアルによると、 "super"によれば、Animalのスーパータイプであるすべての型を保持できます: "コード<?super Animal>は、" Animalのスーパータイプである未知の型自体""。しかしライオンもバタフライも動物のスーパータイプではありません。 – maks