如何在此界面中覆盖此方法(请参阅代码)?

问题描述 投票:8回答:1

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

我做错了什么,为什么这不起作用?编译器一直告诉我“Method不会覆盖其超类中的方法”。

提前致谢!

java object generics interface
1个回答
7
投票

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

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

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

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

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

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

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 */ }
}
© www.soinside.com 2019 - 2024. All rights reserved.