Java Generics: добавление неправильного типа в коллекцию

Кто мог бы мне это объяснить?

У меня есть эта пара классов:

abstract class Animal {
    public void eat() {
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal {
    public void woof() {
        System.out.println("woof");
    }
}

class Cat extends Animal {
    public void meow() {
        System.out.println("meow");
    }
}

И это действие:

import java.util.ArrayList;
import java.util.List;

public class TestClass {

    public static void main(String[] args) {
        new TestClass().go();
    }

    public void go() {
        List<Dog> animals = new ArrayList<Dog>();
        animals.add(new Dog());
        animals.add(new Dog());
        doAction(animals);
    }

    public <T extends Animal> void doAction(List<T> animals) {

        animals.add((T) new Cat()); // why is it possible? 
                                    // Variable **animals** is List<Dog>, 
                                    // it is wrong, that I can add a Cat!

        for (Animal animal: animals) {
            if (animal instanceof Cat) {
                ((Cat)animal).meow();
            }
            if (animal instanceof Dog) {
                ((Dog)animal).woof();
            }
        }
    }
}

Этот пример компилируется без ошибок, и вывод:

woof
woof
meow

Но как я могу добавить в список Dog a Cat? А как Кот превращается в Пса?

Я использую: версия Java "1.6.0_24". Среда выполнения OpenJDK (IcedTea6 1.11.1) (6b24-1.11.1-4ubuntu3)

7
задан Mesop 24 May 2012 в 20:12
поделиться