使用覆盖等效签名继承方法

时间:2017-09-26 06:15:54

标签: java

根据jls-9.4.1.3

  

如果接口我继承了一个默认方法,其签名是覆盖 - 与I继承的另一个方法等效,那么a   发生编译时错误。 (这是另一种方法的情况   是抽象的或默认的。)

从上面的描述中,下面的代码不应该编译。

然而,当我编译这段代码时,它的工作非常好。

interface A {
    void foo(String s);
}

interface B<T> extends A {
    default void foo(T x) {
    }
}

interface C extends B<String> {
}

为什么要编译?

1 个答案:

答案 0 :(得分:5)

  

如果接口我继承了一个默认方法,其签名与I继承的另一个方法等效,则会发生编译时错误。 (无论另一种方法是抽象的还是默认的,都是这种情况。)

报价指的是以下情况:

interface A {
    void foo(String s);
}

interface B<T> {
    default void foo(T x) {
    }
}

interface C extends A, B<String> {        
}

其中C都继承了默认方法和另一个具有相同签名的方法。

在您指定的情况下B#foo已覆盖A#foo,因此C只会继承一个方法。