Java - расширение интерфейса
Я использую этот сайт около 6 месяцев и время, чтобы задать свой первый вопрос, потому что я не могу найти ответ на этот вопрос, по крайней мере, не тот ответ, который я могу понять!
В этом бите кода, почему этот интерфейс распространяется сам?
public interface PositionedVertex<V extends PositionedVertex<V>> {
/**
* @return Position for node data.
*/
public Point getPosition();
}
Не будет ли этот код делать то же самое?:
public interface PositionedVertex<V> {
/**
* @return Position for node data.
*/
public Point getPosition();
}
Спасибо заранее!
Ответы
Ответ 1
Интерфейс не распространяется. <V extends PositionedVertex<V>>
- это ограничение на общий тип, связанный с вашим интерфейсом. Это просто означает, что параметр универсального типа для любого класса, реализующего этот интерфейс, сам должен быть PositionedVertex
.
Ответ 2
В первом случае вы ограничили параметры своего общего типа подтипом самого interface
, тогда как во втором случае вы можете использовать любой тип в качестве типичного параметра типа. Таким образом, это потенциально разные объявления.
Например, вы можете определить ссылку, например:
PositionedVertex<String>
для 2nd interface type
, но не для 1st one
.
Ответ 3
Он не распространяется сам. Он указывает, что его общий параметр V должен представлять тип, который расширяется или реализуется.
Ответ 4
Невозможно сказать, почему, не показывая еще какой-то код. Или это все? То, что на самом деле говорит вам, это то, что в этом интерфейсе используется некоторый тип V (как параметр для функции или как тип возврата), который имеет тот же тип, что и сам интерфейс.
Ответ 5
Это расширение для общего. Дополнительная информация о дженериках:
http://docs.oracle.com/javase/tutorial/extra/generics/intro.html