Java 泛型方法重写其基的泛型方法

Java 泛型方法重写其基的泛型方法,java,generics,Java,Generics,假设 我们有两个类:A和B,它们扩展了A 我们为它们提供了两个包装类:AWrapper和BWrapper,它们BWrapper扩展了AWrapper AWrapper.java class AWrapper { public <T extends A> void wrap(T obj) {} } class BWrapper extends AWrapper { @Override // This doesn't override! why? publi

假设

  • 我们有两个类:
    A
    B
    ,它们扩展了
    A

  • 我们为它们提供了两个包装类:
    AWrapper
    BWrapper
    ,它们
    BWrapper
    扩展了
    AWrapper

AWrapper.java

class AWrapper {
    public <T extends A> void wrap(T obj) {}
}
class BWrapper extends AWrapper {
    @Override // This doesn't override! why?
    public <T extends B> void wrap(T obj) {}
}
Awraper类{
公共void wrap(T obj){}
}
BWrapper.java

class AWrapper {
    public <T extends A> void wrap(T obj) {}
}
class BWrapper extends AWrapper {
    @Override // This doesn't override! why?
    public <T extends B> void wrap(T obj) {}
}
BWrapper类扩展了AWrapper类{
@覆盖//这不会覆盖!为什么?
公共void wrap(T obj){}
}

问题:为什么我们不能在BWrapper.java中泛化重写
wrap
方法?

您的两个泛型参数(均命名为
t
)是不相关的,因为它们是在方法级别定义的。因此,您的
BWrapper
方法不会覆盖同名的
AWrapper
方法

您可以在类级别定义它们:

class A {}
class B extends A {}

class AWrapper<T extends A> {
    public void wrap(T obj) {}
}

class BWrapper<T extends B> extends AWrapper<T> {
    @Override
    public void wrap(T obj) {}
}
class A{}
类B扩展了{}
AWrapper类{
公共void wrap(T obj){}
}
BWrapper类扩展了AWrapper{
@凌驾
公共void wrap(T obj){}
}

我认为,因为在A型振打器中T是A型,在B型振打器中T是B型,所以我认为B型振打器应该扩展A@GilGoldzweig是的,但仍然没有重写。您正在运行哪个java版本?因为
AWrapper
wrap
返回
a
的子类型,因此必须重写子类。
B如何在代码中扩展A