Jul*_*ldt 2 java generics overriding
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
该get1方法工作正常,但有一个编译错误get2:
AB类型的方法get2(Collection)必须覆盖或实现超类型方法
此错误仅在带有泛型的参数中出现.get3编译,但当然有一个警告:
类型参数Object隐藏了Object类型
显然还有其他方法可以解决这个问题,但在我的理解中,这应该是一个合法的覆盖,我的问题更多是为什么会出现这个编译错误.提前致谢!
编辑:
对不起,我的例子还不够清楚.因此,这是一个新的回应你的答案的一些点.
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
get2,以及get我期望得到的明显的类型安全警告get2.get3如上所述,旧的类型隐藏问题很明显.这里:
public <Object> R<Object> get3(Collection<Integer> p) {
Run Code Online (Sandbox Code Playgroud)
可能不是你的意思.
您正在引入另一个类型变量,Object在此处调用.
比较一下:
public R<Object> get2(Collection<String> p) {
Run Code Online (Sandbox Code Playgroud)
换句话说:get2()使用java.lang.Object.get3()使用遗憾类型的泛型类型Object.你也可以写
public <NONSENSE> R<NONSENSE> get3(Collection<Integer> p) {
Run Code Online (Sandbox Code Playgroud)
最后:get2()不是你要做的.请参阅Michael的优秀答案.