Расширенная параметризация классов Java

Задача сделать так чтобы класс Conteiner() был параметризован только типом Car() и Bike() и их потомками, знаю что можно создать их общий супер класс или интерфейс, но лучший ли это способ или есть варианты по лучше

   public static void main(String[] args) {

       Container<Car.Sedan> sdns;
       Container<Bike.Scooter> scts;
   }
}
class Container<T extends Car | Bike> {}

class Car {
   class Sedan extends Car {}
   class Pickup extends Car {}
   class Truck extends Car {}
}
class Bike {
   class Bicycle extends Bike {}
   class Scooter extends Bike {}
   class Motorcycle extends Bike {}
}  

Ответы (1 шт):

Автор решения: Nowhere Man

Желаемый вариант записи <T extends Car | Bike> с использованием оператора ИЛИ | является синтаксической ошибкой, в Java можно применять дополнительные ограничения на обобщённый класс при помощи И &, поэтому в данном случае возможны такие варианты:

  • создать некий общий класс для Car и Bike:
class Common extends Transport {}
class Container<T extends Common> {}
class Car extends Common {}
class Bike extends Common {}
  • создать маркерный интерфейс для объектов в контейнере, тогда классы Car и Bike необязательно должны порождаться от класса Transport
interface Containable {}
class Container<T extends Containable> {}
class Car implements Containable {}
class Bike implements Containable {}
  • создать спецконтейнер для потомков Transport, реализующих интерфейс Containable:
interface Containable {}
class Container<T extends Transport & Containable> {}
class Car extends Transport implements Containable {}
class Bike extends Transport implements Containable {}
→ Ссылка