Java编译错误覆盖泛型参数的泛型方法

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.
  • 我希望每个方法都有自己的类型,因此类类型不是解决方案.
  • 使用Object对于这个例子来说是一个糟糕的决定,但这不是我的观点,get3如上所述,旧的类型隐藏问题很明显.
  • 正如词汇所说,问题在于签名.因此,我将评论他的答案.

Gho*_*ica 5

这里:

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的优秀答案.