【问题标题】:java ArrayList contains different objectsjava ArrayList 包含不同的对象
【发布时间】:2012-11-14 01:20:21
【问题描述】:

是否可以创建 ArrayList<Object type car,Object type bus> list = new ArrayList<Object type car,Object type bus>();

我的意思是将不同类的对象添加到一个数组列表中?

谢谢。

【问题讨论】:

    标签: java object arraylist


    【解决方案1】:

    是的,有可能:

    public interface IVehicle { /* declare all common methods here */ }
    public class Car implements IVehicle { /* ... */ }
    public class Bus implements IVehicle { /* ... */ }
    
    List<IVehicle> vehicles = new ArrayList<IVehicle>();
    

    vehicles 列表将接受任何实现 IVehicle 的对象。

    【讨论】:

      【解决方案2】:

      是的,你可以。但是您需要一个对象类型的通用类。在您的情况下,这将是 Vehicle

      例如:

      车辆类别:

      public abstract class Vehicle {
          protected String name;
      }
      

      公交车班次:

      public class Bus extends Vehicle {
          public Bus(String name) {
              this.name=name;
          }
      }
      

      汽车类:

      public class Car extends Vehicle {
          public Car(String name) {
              this.name=name;
          }
      }
      

      主类:

      public class Main {
          public static void main(String[] args) {
              Car car = new Car("BMW");
              Bus bus = new Bus("MAN");
              ArrayList<Vehicle> list = new ArrayList<Vehicle>();
              list.add(car);
              list.add(bus);
         }
      }
      

      【讨论】:

      • 好的,当我从文件中读取行时,我不知道我读取的是什么对象。我有字符串数组,我需要根据文件中的属性将其分配给正确的对象。?
      • 这个实现不能直接解决。您可以在Vehicle 类中有一个名为createVehicle 的函数,它将尝试解析输入字符串,并创建一个适当的对象。例如,该函数可以查找车辆的制造商——如果是BMW,那么这是Car,否则是Bus
      • 这是正确的吗?第二个数组值是 objectType 所以我这样做。 'ArrayList items = new ArrayList(); while ((strLine = br.readLine()) != null) { String s[] = strLine.split("\\|"); if(s[2].equals("Audi")){ 奥迪 myAud = new Audi(s[0], s[1], s[2], s[4]); items.add(myAud); } else if(s[2].equals("BMW")){ BMW myBmw = new BMW(s[0], s[1], s[2], s[3], s[4]); items.add(myBmw); } else if(s[2].equals("Opel")){ Opel myOpe = new Opel(s[0], s[1], s[2], s[3], s[4]); items.add(myOpe); } else if(s[2].equals("Mazda")){ Mazda myMaz = new Mazda(s[0], s[1], s[2], s[3]); items.add(myMaz); } }'
      • 是的,就在这几行。但是在这里你需要对所有汽车制造商进行分类,这将花费大量时间,而且它不是模块化的。所以我会坚持使用Car 类的表示。然后在构造对象时,调用new Car(s[0],s[1],s[2],s[3],s[4]),其中s[2] 显然是汽车品牌。
      • 对此,请参阅stackoverflow.com/questions/2784514/…。您需要实现自定义Comparator
      【解决方案3】:

      使用多态性。假设您有一个父类 Vehicle 用于 BusCar

      ArrayList<Vehicle> list = new ArrayList<Vehicle>();
      

      您可以将 BusCarVehicle 类型的对象添加到此列表,因为 Bus IS-A Vehicle、Car IS-A Vehicle 和车辆 IS-A 车辆。

      从列表中检索对象并根据其类型进行操作:

      Object obj = list.get(3);
      
      if(obj instanceof Bus)
      {
         Bus bus = (Bus) obj;
         bus.busMethod();
      }
      else if(obj instanceof Car)
      {
         Car car = (Car) obj;
         car.carMethod();
      }
      else
      {
         Vehicle vehicle = (Vehicle) obj;
         vehicle.vehicleMethod();
      }
      

      【讨论】:

      • 这正是我现在正在做的,但我如何才能从扩展类中获取方法?
      • 这是正确的吗?第二个数组值是 objectType 所以我这样做。 'ArrayList items = new ArrayList(); while ((strLine = br.readLine()) != null) { String s[] = strLine.split("\\|"); if(s[2].equals("Audi")){ 奥迪 myAud = new Audi(s[0], s[1], s[2], s[4]); items.add(myAud); } else if(s[2].equals("BMW")){ BMW myBmw = new BMW(s[0], s[1], s[2], s[3], s[4]); items.add(myBmw); } else if(s[2].equals("Opel")){ Opel myOpe = new Opel(s[0], s[1], s[2], s[3], s[4]); items.add(myOpe); } else if(s[2].equals("Mazda")){ Mazda myMaz = new Mazda(s[0], s[1], s[2], s[3]); items.add(myMaz); } }'
      【解决方案4】:

      不幸的是,您不能指定多个类型参数,因此您必须为您的类型找到一个公共超类并使用它。一个极端的例子就是使用Object:

      List<Object> list = new ArrayList<Object>();
      

      请注意,如果您检索项目,您需要将结果转换为您需要的特定类型(以获得完整功能,而不仅仅是普通功能):

      Car c = (Car)list.get(0); 
      

      【讨论】:

      • 谢谢,但在我的情况下,我不能使用这个解决方案,因为我从数组中读取属性,我不知道我从文件中得到什么对象。
      【解决方案5】:

      创建一个类并使用多态性。然后在点击中拾取对象,使用instanceof。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 1970-01-01
        • 2013-11-28
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多