使用不相关的返回类型继承方法

时间:2012-03-14 14:46:53

标签: java inheritance method-hiding

我有以下代码段

public class Test {
    static interface I1 { I1 m(); }

    static interface I2 { I2 m(); }

    static interface I12 extends I1,I2 { I12 m(); }

    public static void main(String [] args) throws Exception {
    }
}

当我尝试编译它时,我收到了错误。

Test.java:12: types Test.I2 and Test.I1 are incompatible; both define m(), but with unrelated return types.

如何避免这种情况?

4 个答案:

答案 0 :(得分:2)

Java - Method name collision in interface implementation中所述,你无法做到这一点。

作为解决方法,您可以创建适配器类。

答案 1 :(得分:1)

只有一种情况可以使用,xamde提到了这种情况,但没有详细解释。它与covariant return types有关。

在JDK 5中,协变返回添加的位置,因此以下是一个有效的情况,可以正常编译并运行没有问题。

public interface A {
    public CharSequence asText();
}

public interface B {
    public String asText();
}

public class C implements A, B {

    @Override
    public String asText() {
        return "C";
    }

}

因此,以下内容将无误运行并在主输出中打印“C”:

A a = new C();
System.out.println(a.asText());

这是有效的,因为String是CharSequence的子类型。

答案 2 :(得分:1)

答案 3 :(得分:0)

我遇到了同样的问题,使用Oracle的JDK 7似乎没问题。