Как синтаксически правильно реализовать интерфейс с типом <K extends Comparable <K>, V>?

Как синтаксически правильно реализовать интерфейс с типом &lt;K extends Comparable &lt;K&gt;, V&gt;?

K и V гарантированно будут либо String, либо Integer. Я довольно много раз использовал дженерики, но никогда не использовал <K extends Comparable<K>, V>, так что сейчас у меня проблемы.

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

Aung Khant 27.10.2018 13:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При реализации универсального интерфейса всегда следует указывать аргументы типа. Вы можете обойтись без их указания, но тогда вы будете использовать необработанные типы, чего вы не должны.

Когда вы указываете их в делать, вам также необходимо указать их действительным образом.

Первый вариант неверен по двум причинам:

  • Когда вы указываете аргументы типа, вы никогда не переписываете границы этого аргумента, поэтому запись K extends Comparable<K> неверна.
  • K и V нигде не определены.

Второй вариант неверен, потому что вы переписали границы на K. Эта опция отличается от первой тем, что здесь определены K и Vнаходятся - K и V являются аргументами типа Son.

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

В идеале вы должны написать что-то вроде:

class Son<K extends Comparable<K>, V> implements Father<K, V> {

}

Обратите внимание, как я не переписывал границы и определил K и V как аргументы типа для Son.

В качестве альтернативы укажите конкретный тип:

class Son implements Father<String, Integer> {

}

Что касается первого, которое вы опубликовали, может ли компилятор не сделать вывод о K из определения интерфейса, в котором явно уже есть вся информация, необходимая для класса? Почему вам нужно снова написать границу, K расширяет сопоставимые вещи, а не просто K для класса?

Aung Khant 27.10.2018 13:45

@AungKhant Именно поэтому вы не должна переписываете привязку.

Sweeper 27.10.2018 13:46

Другие вопросы по теме