Подтвердить что ты не робот

Наследование Java: ограничение списка объектов подкласса

Предположим, что у меня есть 3 класса: автомобиль, кабриолет и гараж.

Автомобиль:

public class Car {    
    private String name;
    private String color;

    public Car(String name, String color) {
        this.name = name;
        this.color = color;
    }    
    //Getters
}

Кабриолет наследуется от автомобиля:

public class Convertible extends Car{
    private boolean roof;

    public Convertible(String name, String color, boolean roof) {
        super(name, color);
        this.roof = roof;
    }

    public boolean isRoof() {
        return roof;
    }
}

В гараже хранится список автомобилей:

public class Garage {
    private int capacity;
    private List<Car> cars = new LinkedList<Car>();

    //Setter for capacity
}

Как я могу создать подкласс Garage под названием ConvertibleGarage, который может хранить только конвертеры?

4b9b3361

Ответ 1

Вы можете использовать несколько дженериков:

public class Garage<T extends Convertible> {
    private int capacity;
    private List<T> cars = new LinkedList<T>();

    public Garage(int capacity) {
        this.capacity = capacity;
    }
}

Это означает, что когда вы создаете экземпляр Garage, теперь вам нужно включить тип параметра, который является конвертируемым или его дочерним элементом.

Garage<Convertible> cGarage = new Garage<>();

Ответ 2

Здесь могут помочь дженерики.

Сделать класс Garage общим Garage<T extends Car>, где a T - тип автомобиля, который он может хранить. Перепишите список cars в общий вид List<T>.

Тогда a Garage<Convertible> станет вашим "ConvertibleGarage".

Ответ 3

Вам не нужно делать второй класс Garage, вы можете использовать Generics:

public class Garage<T extends Car> {

   private int capacity;

   private List<T> cars;

   public Garage() {
       this.cars = new LinkedList<>();
   }

   public static void main(String[] args) {
       Garage<Convertible> garConv = new Garage<>();
       garConv.cars.add(new Convertible("", "", true));

       Garage<Car> garCar = new Garage<>();
       garCar.cars.add(new Car("", ""));
   }
}

С этим единственным классом у вас может быть гараж для автомобиля и один для конвертируемых

Ответ 4

Как объяснили другие ответы, вы решаете свою проблему, создавая Garage класс generic - и, следовательно, разрешая любой экземпляр Garage, чтобы иметь дело с точно одним видом автомобилей.

Но чего не хватает до сих пор: это не "вариант" для решения вашей проблемы - это просто "путь сюда". Ваша идея использования наследования является "неправильной ошибкой". Значение: когда люди начинают с объектно-ориентированного дизайна, они предполагают, что наследование - это ответ на все. И на самом деле это не так. Вы довольно осторожны в создании отношения extends между двумя классами.

И особенно когда речь идет о контейнерах - классах, которые "содержат" другие объекты - тогда generics - это ваша первая мысль!