Как я могу переопределить этот метод в этом интерфейсе (см. код)?

У меня есть интерфейс под названием A:

public interface A { 
    void X(T t);
}

Затем у меня есть два подкласса (B и C), которые реализуют этот интерфейс, но каждый из них передает другой тип в X, скажем, B передает тип foo, а C передает тип bar:

public class B implements A {
    @Override
    public <T extends foo> void X(T type1)
}

public class C implements A {
    @Override
    public <T extends bar> void X(T type2)
}

Что я делаю не так и почему это не работает? Компилятор продолжает говорить мне, что «Метод не переопределяет метод из своего суперкласса».

Заранее спасибо!

А как насчет interface A<T>?

Seelenvirtuose 08.04.2019 19:28

Та же проблема с этим =(

anonymous developer 08.04.2019 19:30

«Та же проблема с этим =(» => Нет. Этого не может быть. Также убедитесь, что у нет больше нет общего метода. Таким образом, метод сводится к void method X(T t).

Seelenvirtuose 08.04.2019 19:34

Да, я удалил общий метод, и теперь он работает. Спасибо!

anonymous developer 08.04.2019 19:36

вероятно, просто опечатка, но <T> void method X(T t) недействителен, не так ли?

user85421 08.04.2019 19:40

Да, я удалил <T> свою ошибку.

anonymous developer 08.04.2019 19:42

скорее method это неправильно (игнорируя отсутствующие ;;)

user85421 08.04.2019 19:43

И часть метода да, это была опечатка.

anonymous developer 08.04.2019 19:43

Исправил всю строку :)

anonymous developer 08.04.2019 19:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
9
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Даже с универсальными методами, когда они переопределены, универсальные методы должны точно совпадать.

Один из способов, который может не соответствовать вашим требованиям, - удалить верхние границы класса реализации, например.

class B implements A {
    @Override
    <T> void X(T type1) { /* impl */ }
}

Но если вам нужна верхняя граница, представьте верхнюю границу с параметром типа в интерфейсе.

interface A<U> { 
    <T extends U> void X(T t);
}

Затем вы можете предоставить аргумент типа для верхней границы в реализующих классах.

class B implements A<Foo> {
    @Override
    public <T extends Foo> void X(T type1) { /* impl */ }
}

class C implements A<Bar> {
    @Override
    public <T extends Bar> void X(T type2) { /* impl */ }
}

Но поскольку все, что вы можете вызвать T, вы также можете вызвать Foo или Bar, возможно, методы не должны быть универсальными.

interface A<T> { 
    void X(T t);
}
class B implements A<Foo> {
    @Override
    public void X(Foo type1) { /* impl */ }
}

class C implements A<Bar> {
    @Override
    public void X(Bar type2) { /* impl */ }
}

Последняя часть вашего ответа сработала! Я просто избавился от общих методов. Большое спасибо!

anonymous developer 08.04.2019 19:36

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