интерфейс разрешает любой аргумент подкласса

#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 .

На самом деле вам нужна другая, типобезопасная версия интерфейса для каждого подтипа.
Вот для чего нужны дженерики; вам нужно сделать интерфейс универсальным.