【问题标题】:Cast the sub class List to base class List [duplicate]将子类 List 转换为基类 List [重复]
【发布时间】:2012-05-19 20:49:35
【问题描述】:

可能重复:
Is List<Dog> a subclass of List<Animal>? Why aren't Java's generics implicitly polymorphic?

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

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

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

还有一个List&lt;Puppy&gt; puppy = new ArrayList&lt;Puppy&gt;();

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

我可以按如下方式进行。

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

但我想要一个直接投射解决方案。有可能吗?

【问题讨论】:

  • 定义“直接铸造解决方案”?
  • 如果您有一个实际上是狗的动物列表,并且您想处理狗而不是动物,那么为什么您的列表是动物列表?
  • 从 Vakimshaar 的评论开始,如果您的代码需要大量像这样的危险转换(可能导致异常),那么您可能应该重新考虑您的代码。例如。而不是像这样添加小狗,而是调用动物类中的一个方法,将它们添加到适当的列表中......为每个子类覆盖该方法
  • 这个演员阵容没有什么危险的@PerryMonschau

标签: java


【解决方案1】:

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

List<? extends Animals> animal;

那么你就可以做到:

List<Puppy> puppy = new ArrayList<Puppy>();
animal = puppy;

【讨论】:

    【解决方案2】:

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

    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.
    

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

    【讨论】:

    • 如果“ani”实际上不包含 Puppy 对象,那么这种方法是危险的。编译器不会抱怨,但puppy 变量实际上会包含对Animal 对象的引用。任何将它们用作“小狗”的尝试都会导致异常。换句话说,castPuppy.get(0) instanceof Puppy 将是错误的!而且Puppy p = castPuppy.get(0)会抛出运行时异常!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2017-07-14
    • 2021-02-23
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    相关资源
    最近更新 更多