Java Generics в сочетании с наследованием интерфейса

#java #generics #inheritance #interface

#java #дженерики #наследование #интерфейс

Вопрос:

У меня проблема с дженериками в Java в сочетании с наследованием интерфейса. Вот пример:

 public interface Type0 { }

public interface Type1 extends Type0 {
    void method();
}

public interface SomeInterface0<T extends Type0> {
   T get();
}

public interface SomeInterface1<T extends Type1> extends SomeInterface0<T> { }
  

Теперь, когда я пытаюсь использовать поле типа SomeInterface1 без параметра типа, java comiler обрабатывает тип SomeInterface1.get() результата метода как Type0 . И не могу скомпилировать что-то подобное:

 ...
SomeInterface1 si1;
...
si1.get().method();
  

Итак, почему SomeInterface1<T extends Type1> по умолчанию используется значение vlue для T = Type0 ?

Ответ №1:

При исключении общих параметров пропускается почти вся логика generics. Определение типа T не будет «умным» и просто посмотрите, как T определяется в этом классе / интерфейсе.

Если вы хотите использовать логику generics, вы должны предоставить общие параметры, а не оставлять их — они все равно могут быть очень, ну, «общими»:

 SomeInterface2<? extends Type1> si1;
si1.get().method();
  

Ответ №2:

Поскольку вы не используете параметр типа при объявлении объекта типа SomeInteface1, компилятор java понятия не имеет, какой фактический класс / интерфейс он вернет при вызове get() . Единственное, что можно сказать наверняка, это то, что это интерфейс, который расширяет Type0 (учитывая объявление SomeInterface0 ).

Когда вы вызываете get() , компилятор проверяет сигнатуру интерфейса, в котором объявлен get() , поэтому единственными известными ему методами, которые могут быть вызваны (без указания явного параметра типа), являются методы, объявленные в Type0 .

Дайте мне знать, если я был слишком запутанным, я постараюсь прояснить ответ! 😛