数组多态与泛型多态

首先看看数组的多态是怎样处理的?

Dog,Cat都继承Animal类。

函数feedAnimals(Animal[ ] animal)的输入参数是基类Animal数组。

Dog [ ] dogs = { new Dog(), new Dog(), new Dog(), new Dog()}

feedAnimals(dogs){

  for(Animal a: animals){

       a.eat();

  }

这样是合法的, 多态就是让子类被当做父类一样操作。


如果feedAnimals(ArrayList animals)的输入参数是泛型Animal的集合呢?

作为ArrayList dogs被作为输入参数,feedAnimals(dogs),结果会怎样?

结果是编译不能通过。


显然对于编译器来说ArrayList不能被看作ArrayList的子类。在回顾一下泛型的定义和目的,泛型是参数化类型,目的是为了保证集合中有类型一致的对象集,所有在编译阶段对泛型做检查。

回头看上面的问题,如果编译器允许dogs作为参数被feedAnimals(ArrayList animals)调用,在feedAnimals()函数里,feedAnimal函数用animals.add(new Cat())就能使得一个Cat的对象混进了Dog的泛型集合里。


你可能感兴趣的:(读书,Java)