2013-12-23 3 views
4

Я смотрел на дифф и увидел этот код:Java дженериков расширение

public interface Vector<T extends Vector> 

который был заменен этим кодом:

public interface Vector<T extends Vector<T>> 

У меня проблемы оберточной мою голову вокруг него, что является разница? Как они работают по-другому?

+2

Я думаю, что эта страница должна ответить на все ваши вопросы: HTTP://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it – robbmj

+1

На самом деле это отвечает на мой вопрос. Иногда мне не удается разобрать язык параметризации java generics в дикой природы. Зная, что это сырой тип, я могу думать об этом с точки зрения ArrayList и ArrayList и т. Д. – talloaktrees

+0

Очень интересный рекурсивный родовой. –

ответ

-1

Разница между этими двумя объявлениями заключается в том, что первый создает предупреждение о компиляторе, а второй - нет. Это связано с тем, что общие типы всегда должны использоваться с параметрами.

Эта декларация гарантирует, что если X реализует Vector он должен быть вектор X:

class X implements Vector<X> { 
... 

Все остальное будет производить ошибку компилятора.

На самом деле такая конструкция используется в JDK:

public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable { 
... 

это означает, что, когда мы заявляем перечислимую X оно (неявно) продолжается Enum<X>

+0

"Это объявление гарантирует, что если X реализует вектор, он должен быть вектором X" Нет, это не так. Теперь мы можем сделать 'класс Y реализует вектор ' – newacct

+0

класс Y реализует вектор дает ошибку компиляции –

+0

Нет, это не задано классом 'X', как вы определили его выше. Вы даже пробовали? – newacct

Смежные вопросы