繁体   English   中英

对象ArrayList循环错误

[英]Object ArrayList For-Loop Error

我有一个对象ArrayList,我需要使用Motor对象的toString()方法,该方法是Vehicle对象的参数。 我的车辆对象位于ArrayList中,该数组通过for循环进行迭代(我知道foreach循环会更容易,但这是分配的一部分)

这是循环的代码:

for (int i = 0; i < VehicleList.size(); i++) {
    System.out.println();
    String info = VehicleList.get(i).toString();
    Motor m = VehicleList.get(i).motor;
    String motorInfo = m.toString();
    System.out.println(info);
    System.out.println(m);
    }

出现错误,提示“ 电动机无法解析或不在字段中 ”。

所有的类都应该允许它起作用,除非我当然缺少一个简单的错误。

这是电机类:

 public class Motor {
    protected String name;
    protected int cylinders;
    protected int bhp;
    protected double displacement;

    public Motor(String name, int cylinders, int bhp, double displacement) {
        this.name = name;
        this.cylinders = cylinders;
        this.bhp = bhp;
        this.displacement = displacement;
    }

    public String toString() {
        return "Motor name= " + name + ", cylinders= " + cylinders + ", bhp= 
     " + bhp + ", displacement= " + displacement;
    }
}

在这里初始化了汽车和车辆的使用(在TestVehicle类中):

        //Motors
        Motor EcoBoost = new Motor("EcoBoost", 6, 310, 2.3);
        Motor Hemi = new Motor("Hemi", 8, 707, 5.7);
        Motor P90D = new Motor("P90D", 0, 762, 0.0);

        //Vehicles
        Vehicle v0 = new PassCar("Ford", "Mustang", 2016, 44500.0, 5, true, EcoBoost);
        Vehicle v1 = new PassCar("Tesla", "Model S", 2016, 121000.0, 2, true, P90D);
        Vehicle v2= new Truck("Dodge", "Ram", 2016, 46000.0, "pickup", 1500, Hemi);

PassCarTruck是具有更多属性的Vehicle的继承类。 如果需要,我可以发布PassCar或Truck类,但我认为这不是问题所在。 我相信它是来自For-Loop,特别是行Motor m = VehicleList.get(i).motor; 但我不确定该如何解决。

车辆类别:

public class Vehicle {
protected String make;
protected String model;
protected int year;
protected double price;

public Vehicle(String make, String model, int year, double price) {
    this.make = make;
    this.model = model;
    this.year = year;
    this.price = price;
}


public void description() {
    System.out.println("Description");
}

public String toString() {
    return "make= " + make + ", model= " + model + ", year= " + year + 
  ", price= " + price;
 }

}

编辑:根据分配要求,不能有任何Getter或Setter,它必须是ArrayList,而不是常规List。 当我切换到我时,出现错误“类型不匹配:无法从ArrayList转换为ArrayList

这是这些类的图像: 在此处输入图片说明

 ArrayList<Object> VehicleList = new ArrayList<>(Arrays.asList(vehicles)); 

VehicleList被声明为包含Object实例,因此编译器将只允许您访问它在Object所有实例上都存在的已知方法和字段。

将其更改为ArrayList<Vehicle>

创建一个接口IMotor ,该接口由Vehicle类使用,并在PassCar和其他车辆实现中实现。

IMotor.java

public interface IMotor {
    public Motor getMotor();
}

马达

public class Motor {
    protected String name;
    protected int cylinders;
    protected int bhp;
    protected double displacement;

    public Motor(String name, int cylinders, int bhp, double displacement) {
        this.name = name;
        this.cylinders = cylinders;
        this.bhp = bhp;
        this.displacement = displacement;
    }

    public String toString() {
        return "Motor name= " + name + ", cylinders= " + cylinders + ", bhp=" + bhp + ", displacement= " + displacement;
    }
}

Vehicle.java

public abstract class Vehicle implements IMotor{
    protected String make;
    protected String model;
    protected int year;
    protected double price;

    public Vehicle(String make, String model, int year, double price) {
        this.make = make;
        this.model = model;
        this.year = year;
        this.price = price;
    }

    public String toString() {
        return "make= " + make + ", model= " + model + ", year= " + year + 
      ", price= " + price;
     }
}

通行证

public class PassCar extends Vehicle{

    protected Motor motor;

    public PassCar(String make, String model, int year, double price, Motor motor) {
        super(make, model, year, price);
        this.motor = motor;
    }

    public Motor getMotor() {
        return motor;
    }
}

Test.java

import java.util.Arrays;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        Motor EcoBoost = new Motor("EcoBoost", 6, 310, 2.3);
        Vehicle v0 = new PassCar("Ford", "Mustang", 2016, 44500.0, EcoBoost);

        List<Vehicle> vehicles = Arrays.asList(v0);
        System.out.println(vehicles.get(0).getMotor());
    }
}

首先,请注意命名约定。 变量应在camcelCase中命名,例如vehicleList instead of VehicleList`

我有一个对象ArrayList

我相信你的意思是vehicleList声明看起来像ArrayList<Object> vehicleList

然后会出现预期的行为,因为编译器仅知道VehicleList.get(i)将向您返回Object引用。 它可以是Vehicle ,也可以是其他任何东西。 因此,它不允许您访问motor字段,因为Object根本没有这样的字段。

将声明更改为类似List<Vehicle> vehicleList


但是,正如其他答案所述,由于各种原因,直接访问该领域并不是一个好主意。 一种较不那么邪恶的方法是使motor吸气。 (更好的方法是提供有意义的行为,而不是提供对内部数据的访问)

您的问题是motor不是Vehicle类的成员,但是您正在尝试通过Vehicle类型的表达式(即vehicleList.get(i)访问它。 这是禁止的,因为编译器无法知道每种可能的Vehicle都有一个motor 毕竟,如果您添加了Bicycle类,会发生什么?

要使此工作正常进行,您应该从TruckPassCar类中删除motor ,并将其添加到Vehicle类中。 这样一来, vehicleList.get(i).motor实际上就有意义,因为可以保证Vehicle表达式引用具有MotorVehicle

还建议对motor字段使用吸气剂-也就是说,将motor作为Vehicle类的private字段,并编写方法getMotor()来返回它。 然后,您可以编写vehicleList.get(i).getMotor()来获取与列表中的一个Vehicle关联的Motor对象。

多亏了您的所有注释和Java教科书的帮助,我才得以将其拼凑起来。 这是我的工作方式:

for (int i = 0; i < vehicleList.size(); i++) {
    String motorInfo = "";
    String info = "";
    System.out.println();
    if (vehicleList.get(i) instanceof PassCar) {
        info = ((PassCar)vehicleList.get(i)).toString();
        **motorInfo = ((PassCar)vehicleList.get(i)).motor.toString();**

    }
    else if(vehicleList.get(i) instanceof Truck) {
        info = ((Truck)vehicleList.get(i)).toString();
        **motorInfo = ((Truck)vehicleList.get(i)).motor.toString();**
    }

基本上,我必须使用多态调用并检查它是否是PassCar或Truck的实例。 至于在课堂上使用的Array和ArrayList,我像这样编辑它们:

Vehicle [] vehicles = new Vehicle [3]; 
vehicles[0] = v0;
vehicles[1] = v1;
vehicles[2] = v2;

showVehicle(vehicles);

ArrayList<Vehicle> vehicleList = new ArrayList<Vehicle>(Arrays.asList(vehicles));
System.out.println();
System.out.println("Output from ArrayList in main: ");

谢谢大家的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM