我有以下问题:

考虑我们有3类:


一个名为Vehicle的抽象类
一类名为Motorcycle的类,它扩展了Vehicle
一类名为Car的类,它扩展了Vehicle


这意味着Vehicle对象可以同时容纳MotorcycleCar对象。

我还有一个名为VehicleDatabase的类,该类基本上是“模拟”数据库(我希望我可以使用数据库,但这是一个大学项目),并包含一个名为ArrayList<Vehicle>db字段以及一些提供一些基本操作的方法这样我就可以与数据库进行交互(CRUD操作和其他一些操作)。

我要实现的一种方法是showVehicles()。为了简化并弄清楚我的问题,假设此方法必须简单地将由函数的参数指定的所有对象的.toString()打印到控制台。

例:

用户中会显示一个菜单:

Select which type of vehicles you want to be shown:

1.Motorcycles
2.Cars

Make your choice:


之后,我们的函数showVehicles必须采用一个参数,例如showVehicles(CarSomething)并打印存储在db ArrayList上的所有汽车。我只是真的找不到更优雅的方法来实现该功能。下面是我当前的实现:

public void showVehicles(Class<?> cls)
{
    for(Vehicle v : db)
    {
        if(v.getClass().equals(cls))
            System.out.println(v.toString());
    }
}


然后像这样调用它:showVehicles(Car.class)showVehicles(Motorcycle.class)

有更好的方法吗?请提出您的建议。我只是觉得我没有像应该那样使用多态。

最佳答案

这是一种可能性。

我创建一个Map<Class<?>, List<Vehicle>>来保存库存。

该地图是根据车辆列表创建的,但可以直接添加到地图中来创建。

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

abstract class Vehicle {
}

class MotorCycle extends Vehicle {
   String name;

   MotorCycle(String name) {
      this.name = name;
   }
   public String toString() {
      return name;
   }
}

class Car extends Vehicle {
   String name;

   Car(String name) {
      this.name = name;
   }

   public String toString() {
      return name;
   }
}

public class CarMapper {

   public static void main(String[] args) {
      List<Vehicle> list = new ArrayList<>();
      list.add(new MotorCycle("Honda"));
      list.add(new MotorCycle("Harley-Davidson"));
      list.add(new Car("Ford"));
      list.add(new Car("Chrysler"));

      Map<Class<?>, List<Vehicle>> inventory = list.stream().collect(
            Collectors.groupingBy(Object::getClass));

     }
}



这是否合理,取决于您(和其他发表评论的人)。您可能仍需要一张地图才能从用户菜单中获取正确的类。

  Map<String, Class<?>>  menuMap = new HashMap<>();
  menuMap.put("Car", Car.class);
  menuMap.put("MotorCycle", MotorCycle.class);

  Class<?> lookup = menuMap.get("Car");

  for (Vehicle v : inventory.get(lookup)) {
     System.out.println(v.toString());
  }

09-27 17:00