有没有更简单的方法来调用子类';Java中子类和超类的ArrayList的s方法

有没有更简单的方法来调用子类';Java中子类和超类的ArrayList的s方法,java,inheritance,arraylist,Java,Inheritance,Arraylist,我有一个类(我们称之为Vehicle)和一个子类(Car)。两者的实例都存储在一个ArrayList中。Car有一个不是从车辆继承的方法doStuff()。我想对ArrayList中的每一辆车都使用doStuff()。这是我想到的最简单的解决方案: vehicleList = new ArrayList<Vehicle>(); roster.add(new Vehicle()); roster.add(new Car());

我有一个类(我们称之为Vehicle)和一个子类(Car)。两者的实例都存储在一个ArrayList中。Car有一个不是从车辆继承的方法doStuff()。我想对ArrayList中的每一辆车都使用doStuff()。这是我想到的最简单的解决方案:

vehicleList = new ArrayList<Vehicle>();
            roster.add(new Vehicle());
            roster.add(new Car());

            for (Vehicle v: vehicleList){
                    if (v instanceof Car){
                            ((Car) v).doStuff();
                    }
            }
vehicleList=新的ArrayList();
花名册。添加(新车());
花名册。添加(新车());
用于(车辆v:车辆列表){
if(车辆的v实例){
(汽车)v.多斯塔夫;
}
}
但我觉得有一种更简单的方法。因此,如果您能提供一个更简单的解决方案,请提前感谢。

最“简单”的解决方案是在车辆中实现doStuff(),而不让它执行任何操作。e、 g

public void doStuff(args) { ; }

然而,这通常意味着设计不佳。可能是个好主意,也可能是个坏主意。

如果您的列表被声明为
列表
,那么这就是正确的方法-如果不检查单个项目是
卡车
,还是
汽车
,或者其他东西,您就无法判断

如果
Vehicle
拥有该方法是有意义的,您可以在那里声明
doStuff
,让它默认不做任何事情,并在
Car
中放置一个真正的实现。不过,这通常是糟糕设计的标志

另一个选择是获得一个
列表
,这样您就不必检查列表中的每个项目的类型。您还可以将
doStuff
作为接口
CanDoStuff
的一部分,这样您就不必检查
Car
——这样您也可以轻松地将其应用于其他类。

有两个选项:

  • doStuff()
    添加到
    Vehicle
    (默认impl可以是“不做任何事情”)

  • 你所拥有的东西。一种确定特定
    车辆是否可以“做事情”的方法。您可以在
    Vehicle
    类中使用
    canDoStuff()
    方法(仍然需要强制转换,基类开始“知道得太多”。您可以使用
    Car
    实现一个
    CanDoStuff
    界面-如果有一天您可能会有一辆
    Van
    也可以使用,那么它比直接使用
    Car
    要好一点


  • 尽可能将类似类型的车辆存储在一起。这样你就不会有这个问题。问问自己,如果所有车辆的行为都不同,为什么要将所有车辆存储在一个列表中。结尾:)


    您可以做一些棘手的事情,比如创建一个“过滤迭代器”,该迭代器基本上返回一个基于类类型的过滤子列表。这是一个高级主题,但是如果您的项目有非常突出的列表方法,那么您只需编写一次过滤器,然后在所有地方使用它。

    没有。如果
    doStuff()
    仅在
    Car
    中声明,则需要一个
    Car
    引用来调用它。我想,您可以添加
    doStuff
    作为
    Vehicle
    的抽象方法,如果你准备把
    Vehicle
    作为一个抽象类。到目前为止,这是最详细的,新的答案几分钟内都没有出现,所以我把你的评为最佳。谢谢你的意见。