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

Jok*_*ker 8 java

根据jls-9.4.1.3

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

从上面的描述下面的代码不应该编译.

但是,当我编译这段代码时,它的工作绝对正常.

interface A {
    void foo(String s);
}

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

interface C extends B<String> {
}
Run Code Online (Sandbox Code Playgroud)

为什么编译?

Luc*_*ens 5

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

报价指的是以下情况:

interface A {
    void foo(String s);
}

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

interface C extends A, B<String> {        
}
Run Code Online (Sandbox Code Playgroud)

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

在你给定的情况下B#foo已经覆盖A#foo,因此C只继承了一个方法.