Java 循环错误的对象ArrayList
我有一个Object ArrayList,我需要使用Motor对象的toString()方法,这是Vehicle对象的一个参数。我的vehicle对象位于一个ArrayList中,该列表通过for循环进行迭代(我知道foreach循环会更容易,但这是赋值的一部分) 以下是循环的代码: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
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 ofmotor
(更好的方法是提供有意义的行为,而不是提供对内部数据的访问)
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转换”