5

可能重复:
List<Dog>的子类List<Animal>吗?为什么 Java 的泛型不是隐式多态的?

我有一个类Dogs的列表,它扩展了Animals并有一个以下类型的列表。

ArrayList<Animals> animal = new ArrayList<Animals>();

现在我有另一个类Puppy,它扩展了 Dogs。

并拥有一个List<Puppy> puppy = new ArrayList<Puppy>();

现在我想将列表animal转换为puppy. 可以直接做吗?

我可以这样做如下。

for (Animals ani: animal){
     puppy.add((Puppy) ani)
}

但我想要一个直接铸造解决方案。是否可以?

4

2 回答 2

16

不,它不会直接工作,除非您将第一个列表定义为:

List<? extends Animals> animal;

那么你将能够做到:

List<Puppy> puppy = new ArrayList<Puppy>();
animal = puppy;
于 2012-05-11T08:57:42.480 回答
1

首先,您必须将基类中的列表定义为...

public ArrayList<? super Animal> ani;

然后将您的基类列表投射到扩展类中...

ArrayList<? extends Animal> puppy= new ArrayList<Puppy>();
puppy= (ArrayList<? extends Animal>)ani;
List<Puppy> castPuppy = (List<Puppy>)puppy;//here we case the base class list in to derived class list.

注意:它可能通过未经检查的异常

于 2012-05-14T10:01:56.047 回答