如何在此接口中重写此方法(请参见代码)?

时间:2019-04-08 17:25:02

标签: java object generics interface

我有一个名为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)
}

我做错了什么,为什么这行不通?编译器不断告诉我“方法不会从其超类覆盖方法”。

谢谢!

1 个答案:

答案 0 :(得分:7)

即使使用泛型方法,当它们被覆盖时,泛型也必须完全匹配。

一种可能不符合您要求的方法是删除实现类的上限,例如

class B implements A {
    @Override
    <T> void X(T type1) { /* impl */ }
}

但是,如果需要上限,则可以在接口上用类型参数表示上限。

interface A<U> { 
    <T extends U> void X(T t);
}

然后,您可以为实现类的上限提供type参数。

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的任何内容,也可以调用FooBar,因此这些方法不必是通用的。

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 */ }
}