#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 .
Дайте мне знать, если я был слишком запутанным, я постараюсь прояснить ответ! 😛