import java.util.Collection;
public abstract class A {
public class R<T> { }
public abstract <X> R<X> get1();
public abstract <X> R<X> get2(Collection<String> p);
public abstract <X> R<X> get3(Collection<Integer> p);
public class B extends A {
@Override
public R<Object> get1() {
return null;
}
@Override
public R<Object> get2(Collection<String> p) {
return null;
}
@Override
public <Object> R<Object> get3(Collection<Integer> p) {
return null;
}
}
}
Метод get1
работает нормально, но есть ошибка компиляции для get2
:
Метод get2 (Collection) типа A.B должен переопределить или реализовать метод супертипа
Эта ошибка возникает только с параметрами с обобщениями. get3
компилируется, но, конечно, есть предупреждение:
Параметр типа Object скрывает тип Object
Ясно, что есть и другие способы решить эту проблему, но, насколько я понимаю, это должно быть юридическим преимуществом, и мой вопрос больше в том, почему возникает эта ошибка компиляции. Заранее спасибо!
EDIT:
Извините, мой пример был недостаточно ясен. Поэтому здесь можно по-новому отреагировать на некоторые пункты ваших ответов.
public abstract class A {
public abstract class R<T> { }
public abstract <X> R<X> get();
public abstract <Y> R<Y> get2(Collection<String> p);
public abstract <Z> R<Z> get3(Collection<Integer> p);
public class B extends A {
@Override
public R<String> get() {
return null;
}
@Override
public R<Double> get2(Collection<String> p) {
return null;
}
@Override
public <V> R<V> get3(Collection<Integer> p) {
return null;
}
}
}
- Та же ошибка компиляции, что и выше для
get2
, и очевидное предупреждение о безопасности типа для get
, которое я также ожидал получить на get2
.
- Я хочу, чтобы у каждого метода был свой тип, поэтому тип класса не является решением.
- Использовать Object было плохим решением для этого примера, но это не было моей целью, и проблема скрытия типов для старого
get3
ясна, как упомянуто выше.
- Проблема заключается в подписи, как сказал лексикоре. Поэтому я прокомментирую его ответ.