我想使用 Vehicle class (即 Vehicle c = new Car() )创建 Car 对象,并将其正确插入到列表中

I want to Create Car object using Vehicle class ( i.e Vehicle c = new Car() ), and insert it into the list correctly

我使用 Vehicle class 创建了一个 Car 对象(即 Vehicle c = new Car() ),但我的问题是如何将其插入列表然后提示用户输入该对象的详细信息插入列表后

import java.util.ArrayList;
import java.util.Scanner;
public class TestCar {

    public static void main(String[] args) {
        ArrayList<Car>list=new ArrayList<Car>();
        Scanner in=new Scanner(System.in);

        list.add(new Car());
         list.add(new Car("Mitsubishi",1993,5,"Pajero"));

        System.out.println("Enter Brand");
        String Brand=in.nextLine();

        System.out.println("Enter Year");
        int Year=in.nextInt();

        System.out.println("Enter Engine size");
        double Enginesize=in.nextDouble();

        System.out.println("Enter Model");
        String Model=in.nextLine();

        list.get(0).setBrand(Brand);
        list.get(0).setYear(Year);
        list.get(0).setEngineSize(Enginesize);
        list.get(0).setModel(Model);

        Veichle c = new Car(Brand, Year, Enginesize,Model); // Creating a   new object
        list.add(c); // This add will be wrong because cuz 
                     //it will tell me to change type c to car
                     // so whats the correct add?

        in.close();
    }
}

您已经创建了一个 ArrayList<Car> - 您可以 添加编译器 知道 的元素到该列表汽车。所以你可以使用:

list.add((Car) c);

或者更简单地说,只需将 c 的类型声明为 Car 开始:

Car c = new Car(...);

获取列表的值 out,你可以使用 Vehicle,因为每个 Car 都是一个 Vehicle:

Vehicle vehicle = list.get(0);

或者,您可以将 list 变量更改为:

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

或等效地:

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

(请注意,通常最好使用接口(在本例中为 List)作为变量类型,即使您需要指定具体的 class(此处为 ArrayList ) 创建实例。)

然而,此时,如果 setBrand 仅在 Car 上定义,而不是在车辆上定义,那么您修改品牌等的代码将不起作用 - 因为 list.get(0) 只会 return一个Vehicle。您可能会使用:

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

...但很明显,如果您的列表 实际上 包含非汽车车辆,那将失败(在执行时)。

从根本上说,您需要决定您的列表应该能够包含任何 车辆,还是只能包含汽车。

顺便说一句,我强烈建议您开始遵循 Java 命名约定 - 使用 camelCase 作为局部变量(yearbrand 等。 )

您应该将其创建为:

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

观察两点:

  1. 始终对界面进行编程。
  2. 汽车始终是交通工具,但倒车并不总是正确的。

此外,IMO 下面的代码真的很难看:

list.get(0).setBrand(Brand);
list.get(0).setYear(Year);
list.get(0).setEngineSize(Enginesize);
list.get(0).setModel(Model);

你必须这样做。

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

执行此操作后,您可以在列表

中添加车辆类型及其所有子类的对象

假设:

    class Vehicle {
     //some implmentation
    }

    class Car extends Vehicle {
     //some implementation
    }

    class Truck extends Vehicle {
     // some implementation
    }

    class Main{
     public static void main(String[] args) {
      List<Vehicle> list = new ArrayList<Vehicle>();
      Car car = new Car();
      Truck truck = new Truck();
      list.add(car);
     list.add(truck)
     // you need to check the instance and cast with its appropriate class. 
      Vehicle obj = list.get(1);
      Car car1 = null;
if(obj instanceOf Car){
       car1 = (Car) obj;
}



    }
    }

或者您可以简单地执行此操作,然后在列表中添加之前用汽车转换您的多态对象。像这样。

List.add((Car) car);