gpt4 book ai didi

Java 8 默认方法继承

转载 作者:搜寻专家 更新时间:2023-10-30 21:17:39 25 4
gpt4 key购买 nike

假设有以下类型:

public interface Base {

default void sayHi(){
System.out.println("hi from base");
}
}

public interface Foo extends Base {
@Override
default void sayHi(){
System.out.println("hi from foo");
}
}

public interface Bar extends Base {
}

public class MyClass implements Foo, Bar {
public static void main(String[] args) {
MyClass c = new MyClass();
c.sayHi();
}
}

在这种情况下,如果执行 main,则会打印“hi from foo”。为什么 Foo 的实现优先? Bar 不会从 Base 继承 sayHi(),因为如果 MyClass 只实现 Bar ,将调用 Base 实现?因此,代码仍然无法编译是有意义的。此外,由于 Bar 应该有 BasesayHi() 实现,为什么我不能在 MyClass 喜欢:

@Override
public void sayHi() {
Bar.super.sayHi();
}

尝试这样做时出现以下错误:

bad type qualifier Bar in default super call method, sayHi() is overridden in Foo

最佳答案

此行为几乎是使用您在 JLS 9.4.1 中的示例指定的, 只是改变了一些名字:

interface Top {
default String name() { return "unnamed"; }
}
interface Left extends Top {
default String name() { return getClass().getName(); }
}
interface Right extends Top {}

interface Bottom extends Left, Right {}

Right inherits name() from Top, but Bottom inherits name() from Left, not Right. This is because name() from Left overrides the declaration of name() in Top.

JLS 似乎没有给出任何我能看到的特别具体的原因;这正是 Java 设计者决定继承的方式。

关于Java 8 默认方法继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37197301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com