Различное поведение массива v.s. list <T> в Java для подкласса

Выученный List<Dog> не является подклассом List<Animal> по ряду причин (Является ли List <Dog> подкласс List <Animal> ? Почему Генераторы Java неявно полиморфны? и создают список списка строк в Java)

Но я тестировал, что массив работает - экземпляр Dogs[] может быть назначен экземпляру Animal[]. Но не имеет ли такая массив проблема с помещением экземпляра Cat в массив Dog?

Смотрите мой ниже код для TestArray, который работает для массива, но TestList не работает для List<T>.

Любые мысли?

Исходный код в Java,

import java.util.*;
public class TestInheritance {

    void TestArray() {
        Dog[] dogs = new Dog[3];
        Animal[] ans = dogs;
        Cat c = new Cat();
        ans[2] = c;
    }

    void TestList() {
        List<Dog> dogs = new ArrayList<Dog>();
        /*
         * compile error in below statement, Type mismatch: cannot convert from List<TestInheritance.Dog>
         * to List<TestInheritance.Animal>
         */
        List<Animal> ans = dogs;
    }

    class Animal {
        Animal() {

        }

        void WhoAmI() {
            System.out.println("I am Animal!");
        }
    }

    class Dog extends Animal {
        Dog() {

        }

        void Dog() {
            System.out.println("I am Dog!");
        }
    }

    class Cat extends Animal {
        Cat() {

        }

        void Cat() {
            System.out.println("I am Cat!");
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

Ответы