Если у меня есть суперкласс, назовем его Car, с параметрами конструктора String name, String color, double wheelSize и его подклассом, назовем его Truck, с параметрами конструктора String name, String color, double wheelSize и double truckBedArea, а в подклассе (Truck) у меня есть метод под названием ModifyCar с параметрами Car car, String newName, String newColor, double newWheelSize и double newTruckBedArea, как я могу найти способ взять этот объект Car и указать, что он действительно является грузовиком, поэтому я могу использовать установщик грузовика (setTruckBedArea), чтобы установить новую площадь кузова грузовика? Этот пример не является хорошим сравнением с моим фактическим заданием, но у меня есть поле ArrayList моего суперкласса (Cars), называемое «ArrayList cars» объектов «Car», и мне нужно найти способ изменить этот объект «Car». в этом поле ArrayList, что я уже нашел способ сделать. Я просто перебираю каждый элемент в ArrayList "Cars" до тех пор, пока он не сравняется с экземпляром Car, введенным в качестве параметра, и если это так, я затем говорю "cars.get(i).//setter" (по существу) . Однако это не сработает, если я скажу «cars.get(i).setTruckBedArea(newTruckBedArea)». Я не уверен, как преобразовать объект Car в этом списке Cars в Truck, чтобы затем получить доступ к сеттеру, который я хочу использовать. Основная проблема заключается в том, что мне необходимо реализовать интерфейс (назовем его «Автомобиль»), в котором автомобили ArrayList должны быть типа cars, поскольку он указан в интерфейсе Vehicle (в противном случае я бы просто изменил ArrayList поле для грузовых автомобилей ArrayList).
Пример:
public class Truck implements Vehicle { //have to implement this interface
//... other fields
private ArrayList<Car> cars;
//... other methods/constructors
public void modifyCar(Car car, String newName, String newColor, double newWheelSize, double newTruckBedArea) {
//have to have "Car car" as parameter for this method because of interface
for (int i = 0; i < cars.size(); i++) {
if (cars.get(i).equals(car)) {
cars.get(i).setColor(newColor);
cars.get(i).setName(newName);
cars.get(i).setWheelSize(newWheelSize);
cars.get(i).setTruckBedArea(newTruckBedArea); //will produce error
}
}
}
}
Насколько я понимаю вопрос, вы можете использовать оператор instanceof:
if (cars.get(i) instanceof Truck){
Truck truck = (Truck) cars.get(i);
truck.setTruckBedArea(newTruckBedArea);
}
Оператор instanceof возвращает логическое значение в зависимости от того, является ли объект экземпляром данного типа или нет.
Транспортное средство должно быть абстрактным классом.
Автомобильный интерфейс
public interface Car {
void modifyCar(Car car, String newName, String newColor, double newWheelSize, double newTruckBedArea);
}
Абстрактный класс транспортного средства
public abstract class Vehicle implements Car {
String name;
String color;
double wheelSize;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public double getWheelSize() {
return wheelSize;
}
public void setWheelSize(double wheelSize) {
this.wheelSize = wheelSize;
}
}
Класс грузовика
public class Truck extends Vehicle {
double truckBedArea;
private ArrayList<Car> cars;
public double getTruckBedArea() {
return truckBedArea;
}
public void setTruckBedArea(double truckBedArea) {
this.truckBedArea = truckBedArea;
}
public ArrayList<Car> getCars() {
return cars;
}
public void setCars(ArrayList<Car> cars) {
this.cars = cars;
}
@Override
public void modifyCar(Car car, String newName, String newColor, double newWheelSize, double newTruckBedArea) {
for (int i = 0; i < cars.size(); i++) {
if (cars.get(i).equals(car)){
((Vehicle)cars.get(i)).setColor(newColor);
((Vehicle)cars.get(i)).setWheelSize(newWheelSize);
((Truck)cars.get(i)).setTruckBedArea(newTruckBedArea);
}
}
}
}
Выполнить код.
public static void main(String[] args) {
// TODO code application logic here
Truck trucks = new Truck();
trucks.setColor("Red");
trucks.setName("Nissan");
trucks.setWheelSize(20.15);
trucks.setTruckBedArea(3.5);
ArrayList<Car> cars = new ArrayList<Car>();
cars.add(trucks);
trucks.setCars(cars);
trucks.modifyCar(trucks, "Kia", "Blue", 15.5, 14.0);
System.out.println(trucks.getTruckBedArea());
}
Отвечает ли это на ваш вопрос? Для чего используется оператор instanceof в Java?