Введите границы с сопоставимым интерфейсом в Java - PullRequest
1 голос
/ 15 марта 2020

В JDK 11 я создаю обобщенный класс c с именем "Collection", так что любой тип, предоставляемый для параметра типа, должен реализовывать интерфейс Comparable. Объявление класса в настоящее время выглядит следующим образом:

public class Collection <T extends Comparable<T>> 

Изначально я думал, что объявление класса должно быть таким:

public class Collection <T implements Comparable<T>> 

, но JDK это не понравилось.

Поэтому мой вопрос заключается в том, почему объявление класса является первым, а не вторым. Разве мы не расширяем классы и не реализуем интерфейсы?

Ответы [ 3 ]

2 голосов
/ 15 марта 2020

Что касается синтаксиса объявления границ, архитекторы языка, добавившие обобщения в Java 5, столкнулись со следующим выбором:

  • Зеркально отразить структуру объявления (с отдельными extends и implements bounds) или
  • Выберите одну форму для ограниченных сверху типов (например, T extends Foo, T <: Foo, et c.)

Последняя была (разумно , IMO) рассматривается как более прагматичный выбор c, так как в момент объявления переменной типа, является ли супертип классом или интерфейс не материален, и имеет суетливый синтаксис, который требует от клиентов использовать именно Правильное ключевое слово (и сделало бы составные границы, такие как <T extends ArrayList implements Serializable> еще более уродливым), скорее всего, будет рассматриваться как просто усложняющее использование, без реальной выгоды для авторов или читателей кода.

Такое решение часто принимается по мере развития языка, где строгое соответствие с прецедентом только усложнит ситуацию, не принося никакой пользы, и поэтому иногда дизайнеры языка (после тщательного рассмотрения плюсов и минусов обеих альтернатив) выбирайте порвать с прецедентом ради лучшего результата.

0 голосов
/ 15 марта 2020

Хотели бы вы поэтому implements E или extends E, учитывая, что E может быть классом или интерфейсом? Если вам не нужно третье ключевое слово (возможно, контекстно-зависимое), тогда не имеет смысла различать guish.

0 голосов
/ 15 марта 2020
  1. Коллекция уже в java.util. Создание другого класса с таким именем может всех запутать; Я предлагаю вам выбрать что-то еще.

  2. Дженерики вообще о типах. Слово extends используется, и это своего рода отражает то же использование этого ключевого слова, например, class Foo extends Bar, но это не совсем то же самое значение. Суть в том, что spe c говорит, что это extends, а не implements, независимо от того, что будет после, и нет особого смысла идти дальше, чем «spe c говорит об этом».

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