#java #generics
#java #дженерики
Вопрос:
Я хочу иметь объект класса, но я хочу заставить любой класс, который он представляет, расширять класс A, а также класс B. Я могу сделать
<T extends ClassA amp; ClassB>
но невозможно расширить из обоих классов, есть ли способ сделать это?
Комментарии:
1. Вы можете расширить из одного класса и нескольких интерфейсов.
2. Вы не можете расширить из нескольких классов, потому что Java не поддерживает множественное наследование классов, точка. Это не проблема дженериков.
3. спасибо за ваш ответ, но мне нужно расширить из двух классов, а не из класса и нескольких интерфейсов.
4. Что насчет «Java не поддерживает множественное наследование классов» не ясно? Вы не можете расширить из двух классов. Полная остановка. Это то, что вы не можете обойти, если только классы не находятся в одной иерархии, и в этом случае вам не нужно расширять из двух классов.
5. если будет возможно написать дженерики, которые расширяются из двух классов, вы не сможете инициализировать такой класс, потому что вы не можете написать класс, который соответствует требованиям (java не может умножать наследование)
Ответ №1:
В java у вас не может быть класса, который расширяется из двух классов, поскольку он не поддерживает множественное наследование. Что у вас может быть, это что-то вроде так:
public class A
...
public class B extends A
...
public class C extends B
...
Затем в вашей общей подписи вы можете указать, что T
должно расширяться C
: <T extends C>
.
Вы могли бы взглянуть на Default Methods
(если вы работаете с Java 8), которые по сути являются методами, объявленными в интерфейсах, а в Java класс может реализовывать несколько интерфейсов.
Ответ №2:
Простой способ решения этой проблемы — наследование.
public class A { // some codes }
public class B extends A { }
<T extends A>
Ответ №3:
Java не имеет множественного наследования в качестве проектного решения, но вы можете реализовать несколько интерфейсов.
Начиная с Java 8, эти интерфейсы могут иметь реализации.
Для использования нескольких классов существуют другие шаблоны:
-
Если родительские классы предназначены исключительно для этого дочернего класса, но обрабатывают совершенно разные аспекты и поэтому были разделены, поместите их в единую искусственную иерархию. Я признаю, что делал это один раз.
-
Используйте делегирование; дублируйте API и делегируйте.
-
Используйте механизм поиска / обнаружения для очень динамичного поведения.
открытый поиск T (класс klazz);
Для этого потребуется изменение API, но оно разъединяет классы и является динамическим.