Как преобразовать объект ArrayList объектов (типа суперкласса) в объект типа подкласса

Если у меня есть суперкласс, назовем его 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 в Java?

Alexander Ivanchenko 15.03.2022 20:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Насколько я понимаю вопрос, вы можете использовать оператор 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());
    }

Другие вопросы по теме