Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环错误的对象ArrayList_Java_Inheritance_Arraylist_Tostring - Fatal编程技术网

Java 循环错误的对象ArrayList

Java 循环错误的对象ArrayList,java,inheritance,arraylist,tostring,Java,Inheritance,Arraylist,Tostring,我有一个Object ArrayList,我需要使用Motor对象的toString()方法,这是Vehicle对象的一个参数。我的vehicle对象位于一个ArrayList中,该列表通过for循环进行迭代(我知道foreach循环会更容易,但这是赋值的一部分) 以下是循环的代码: for (int i = 0; i < VehicleList.size(); i++) { System.out.println(); String info = VehicleList.g

我有一个Object ArrayList,我需要使用Motor对象的toString()方法,这是Vehicle对象的一个参数。我的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);
    }
电机和车辆在此初始化(在测试车辆类别中):

PassCar和Truck是继承的车辆类,具有更多的属性。如果需要,我可以邮寄PassCar或Truck类,但我不认为这是问题的根源。我相信它来自For循环,特别是行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,而不是常规列表。切换到时,出现错误“类型不匹配:无法从ArrayList转换为ArrayList”

以下是课程的图片:

创建一个接口
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;
    }
}
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;
     }
}
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());
    }
}
Motor.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;
    }
}
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;
     }
}
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());
    }
}
Vehicle.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;
    }
}
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;
     }
}
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());
    }
}
PassCar

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

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;
    }
}
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;
     }
}
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());
    }
}
导入java.util.array;
导入java.util.List;
公开课考试{
公共静态void main(字符串[]args){
电机EcoBoost=新电机(“EcoBoost”,6310,2.3);
车辆v0=新帕斯卡(“福特”、“野马”,2016,44500.0,EcoBoost);
列出车辆=阵列。asList(v0);
System.out.println(vehicles.get(0.getMotor());
}
}

首先,请注意命名惯例。变量应在
camcelCase
中命名,例如车辆列表
而不是
车辆列表`

我有一个对象数组列表

我相信你的意思是
车辆列表的声明
看起来像
ArrayList车辆列表

因为编译器只知道
VehicleList.get(i)
将返回一个
对象
引用,所以行为是预期的。它可以是
车辆
,但也可以是其他任何东西。所以它不允许您访问
电机
字段,因为
对象
中根本没有这样的字段

将您的声明更改为类似“列出车辆列表”


然而,正如在另一个答案中提到的,由于各种原因,直接访问字段不是一个好主意。一个稍微不那么坏的方法是让getter of
motor
(更好的方法是提供有意义的行为,而不是提供对内部数据的访问)

ArrayList VehicleList=新的ArrayList(Arrays.asList(vehicles));
车辆列表
声明包含
对象
的实例,因此编译器只允许您访问它知道存在于
对象
的所有实例上的方法和字段


将其更改为
ArrayList

多亏了您的评论和我的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();**
    }
for(int i=0;i
基本上,我必须使用多态调用并检查它是否是PassCar或Truck的实例。 至于课程中使用的数组和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: ");
Vehicle[]车辆=新车[3];
车辆[0]=v0;
车辆[1]=v1;
车辆[2]=v2;
展示车辆;
ArrayList vehicleList=新的ArrayList(Arrays.asList(vehicles));
System.out.println();
System.out.println(“主目录中ArrayList的输出:”);

谢谢大家的帮助!

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

要执行此操作,您应该从
卡车
客车
类中删除
电机
,并将其添加到
车辆
类中。这样,
车辆列表。获取(i).motor
实际上是有意义的,因为
Vehicle
表达式将保证引用带有
motor的
Vehicle


还建议对
motor
字段使用getter,也就是说,将
motor
作为
Vehicle
类的
private
字段,并编写方法
getMotor()
返回它。然后可以编写
vehiclelelist.get(i).getMotor()
获取与列表中一辆
车辆
关联的
电机
对象。

车辆
类是否有名为
电机
的字段?显示
车辆列表
的声明。请发布
车辆
类。在类
车辆
中创建变量
电机
,这是一个list of
对象
。将其更改为
列表
。项目要求的一部分是我不能使用getter或setter。此外,它不能是列表,它必须是ArrayList。当我切换到时,我得到错误“类型不匹配:无法从Arr转换”