Java Generics в сочетании с наследованием интерфейса - PullRequest
4 голосов
/ 02 октября 2011

У меня проблема с обобщениями в 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 обрабатывает тип результата метода SomeInterface1.get() как Type0.И не может скомпилировать что-то вроде этого:

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

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

Ответы [ 2 ]

6 голосов
/ 02 октября 2011

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

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

SomeInterface2<? extends Type1> si1;
si1.get().method();
2 голосов
/ 02 октября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...