Как переопределить интерфейс, использующий универсальный метод?

у меня нет доступа к коду интерфейса; Я просто знаю, что есть метод с именем dequeue(), который нужно переопределить в абстрактном классе, который его реализует.

Имя интерфейса — UrgencyQueue, а абстрактный класс — BaseLinkedUrgencyList.

ниже вся информация, которая у меня есть об интерфейсе, изображение UML и javadoc

Ниже моя попытка переопределить указанный метод:

public <Type> void dequeue(Consumer<Type> action) {
    throw new UnsupportedOperationException("Method: not implemented.");
}

Объявление класса включает implements ''interface''.

Выдается ошибка:

error: name clash: dequeue(Consumer<Type#1>) in BaseLinkedUrgencyQueue and dequeue(Consumer<Type#2>) in UrgencyQueue have the same erasure, yet neither overrides the other
    public <Type> void dequeue(Consumer<Type> action) {
                       ^
  where Type#1,Type#2 are type-variables:
    Type#1 extends Object declared in method <Type#1>dequeue(Consumer<Type#1>)
    Type#2 extends Object declared in class BaseLinkedUrgencyQueue

Пожалуйста, включите соответствующие части определения интерфейса: строку объявления с любыми параметрами типа плюс сигнатуру метода dequeue. Также включите строку объявления реализующего класса. Я хотел бы посмотреть, как объявляются и используются все параметры типа в классе и методах, а также как они наследуются, если вообще наследуются.

rgettman 29.03.2023 23:01

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

khelwood 29.03.2023 23:02

@user16320675 user16320675 в этом была проблема, я не знал, что это так работает, большое спасибо. Не стесняйтесь опубликовать это как ответ, чтобы вы могли получить кредит.

Bryce Wellman 29.03.2023 23:24

на самом деле это комментарий @khelwood - я просто конкретизировал его

user16320675 29.03.2023 23:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

Итак, если объявление класса выглядит примерно так:

public class BaseLinkedUrgencyList<Type> implements UrgencyQueue<Type>

тогда реализация метода должна быть такой:

@Override
public void dequeue(Consumer<Type> action)

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