java - 添加到 ArrayList 时是否会转换对象?

标签 java polymorphism

如果我创建一个接口(interface):wood,它由许多对象实现,例如 oakpine

当我创建这个时:

Pine tree = new Pine();
Oak trunk = new Oak();

ArrayList<wood> woods = ArrayList<wood>();

woods.add(tree);
woods.add(trunk);

并这样使用它:

for(wood tree: woods){
    if(tree.gettype() == PINE)
         tree.getbranch();
    else if(tree.gettype() == OAK)
         tree.gettrunk();
}

树对象是否使用 Oak 或 Pine 对象中的方法?

根据测试,我认为它将使用相应的对象,但我只是想确定一下。

最佳答案

每当您将某些内容向上转换为其接口(interface)类型时,您只能使用该接口(interface)定义的方法。

也就是说,您不能使用 OakPine 定义的任何更专门的方法。您只能使用 wood 定义的任何内容。
因此,如果您想使用 OakPine 定义的方法,您需要将它们的对象向下转换为适当的类类型。

这个:

for(wood tree: woods){
    if(tree.gettype() == PINE)
         tree.getbranch();
    else if(tree.gettype() == OAK)
         tree.gettrunk();
}  

应替换为:

for(wood tree : woods){
    if(wood.getClass().getName().equals("Pine")){
        // chop that tree ! destroy nature !
    }else if(wood.getClass().getName().equals("Oak")){
        // more deforestation !
    }
}

关于java - 添加到 ArrayList 时是否会转换对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19468403/

相关文章:

c++ - 为什么多态类型的原始数组是危险的

java - Java 中的字符串联合

java - 命令: "DELETE FROM Table where ..." doesn't work

带有 Java 代码内容荧光笔的 JavaFX 代码编辑器

c++ - 我可以简化这个吗?

c++ - 使用指向基类的指针时的默认析构函数

c++ - 如何正确删除基类元素

java - 如何识别桌面上的 shell 以使用 swtbot 进行测试?

java - 将对象作为 "root"放入 VelocityContext

c++ - 销毁期间派生的成员(member)国