Универсальный класс E с параметром типа является подклассом E - PullRequest
2 голосов
/ 17 апреля 2019

Я относительно новичок в концепции обобщения в Java, и я не могу сказать разницу между двумя ответами.

Вопрос под рукой:
Предположим, у нас есть универсальный класс E, и мы хотимпараметр типа E должен быть подклассом E.Другими словами, мы допускаем E<F> только в том случае, если класс F либо E, либо наследуется от E.

. Я сузил варианты до того, что возможно.

1. class E<T extends E>
2. class E<T extends E<T>>.

Я считаю, что вариант 1 соответствует спецификации для вопроса.Однако я не совсем понимаю вариант 2, что он на самом деле расширяет.

1 Ответ

3 голосов
/ 17 апреля 2019

Ну, вариант 1 на самом деле использует необработанный тип.

Вы определяете E как параметр T, поэтому E является параметризованным типом. Если вы определяете T для расширения E, вы также должны указать параметр типа E, иначе E - это необработанный тип.

Таким образом, единственная «действительная» 1 опция - это опция 2:

class E<T extends E<T>>

Класс Enum является хорошо известным примером параметра рекурсивного типа. См. Определение Java Enum .

.

1 Технически, первый вариант также действителен в смысле синтаксически правильного. Но необработанные типы существуют только для обратной совместимости. Новый код должен никогда содержать необработанные типы. См. Также Что такое необработанный тип и почему мы не должны его использовать? .

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