#java #inheritance #interface
#java #наследование #интерфейс
Вопрос:
Если у меня есть такие классы
class SuperType {}
class SubTypeOne extends SuperType {}
class SubTypeTwo extends SuperType {}
Я хочу создать такой интерфейс
interface TypeHandler {
public void handle(SuperType arg);
}
Но позволяет им быть допустимой реализацией
class SubTypeOneHandler implements TypeHandler {
public void handle(SubTypeOne arg) { }
}
Как вы можете видеть, используя подкласс типа аргумента, определенного в интерфейсе.
Я попытался переписать интерфейс, используя
interface TypeHandler {
public void handle(? extends SuperType arg);
}
Но не похоже, что это допустимая java.
Комментарии:
1. Вам нужно сделать интерфейс универсальным.
2. @SLaks о, я вижу,
interface TypeHandler<T extends SuperType>
? Это единственный способ?
Ответ №1:
Это принципиально небезопасно; если интерфейс объявлен как принимающий a SuperType
, вы должны иметь возможность вызывать любую реализацию с любым подклассом SuperType
.
На самом деле вам нужна другая, типобезопасная версия интерфейса для каждого подтипа.
Вот для чего нужны дженерики; вам нужно сделать интерфейс универсальным.