У меня есть интерфейс под названием 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)
}
Что я делаю не так и почему это не работает? Компилятор продолжает говорить мне, что «Метод не переопределяет метод из своего суперкласса».
Заранее спасибо!
Та же проблема с этим =(
«Та же проблема с этим =(» => Нет. Этого не может быть. Также убедитесь, что у нет больше нет общего метода. Таким образом, метод сводится к void method X(T t).
Да, я удалил общий метод, и теперь он работает. Спасибо!
вероятно, просто опечатка, но <T> void method X(T t) недействителен, не так ли?
Да, я удалил <T> свою ошибку.
скорее method это неправильно (игнорируя отсутствующие ;;)
И часть метода да, это была опечатка.
Исправил всю строку :)




Даже с универсальными методами, когда они переопределены, универсальные методы должны точно совпадать.
Один из способов, который может не соответствовать вашим требованиям, - удалить верхние границы класса реализации, например.
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 */ }
}
Последняя часть вашего ответа сработала! Я просто избавился от общих методов. Большое спасибо!
А как насчет
interface A<T>?