でジェネリックを理解したと思いましたsuper
。しかし、私は完全に間違っているに違いありません:
この簡単な例では:
class Animal{}
class Dog extends Animal{}
このコードは、Dog のスーパー クラスを渡しているため、正常に機能します。
static void addThis(ArrayList<? super Dog> a) {
a.add(new Dog());
}
...
ArrayList<Animal> dogs=new ArrayList();
addThis(dogs);
しかし、私が理解していないのは、これは同じことだと思ったということです:
ArrayList<? super Dog> dogs2=new ArrayList();
dogs2.add(new Animal());
しかし、コンパイルに失敗します。2つの違いは何ですか?
ところで、こっそり別の質問をしたいと思います。間に違いはありますか
// This...
ArrayList<Animal> dogs=new ArrayList();
// ... and this?
ArrayList<Animal> dogs=new ArrayList<Animal>();
与えられた型の消去がコンパイル時にそれを削除すると、コンパイラが参照型をチェックしていることと同じだと思います。これは正しいです?