扩展类和实现接口之间的交互

3
public class Main {

public static class ClassBase {

    public void test() {
        System.out.println("1");
    }

}

public static interface Interface {

    default void test() {
        System.out.println("2");
    }

}

public static class MyClass extends ClassBase implements Interface {

}

public static void main(String[] args) {
    new MyClass().test();
}

}

在这个例子中,它将始终打印1。 要打印2,我必须在MyClass中覆盖test并返回Interface.super.test()
有没有一种方法可以使Interface::test方法覆盖ClassBase::test方法而不手动在MyClass中覆盖该方法? (在示例中打印2)

有办法吗?当然,将接口作为类,将类作为接口即可。 - shmosel
看起来你只想让你的类实现接口。如果是这种情况,就让MyClass不要扩展ClassBase。 - Anil
为什么不继承ClassBase,而试图“注入”一个无关的接口? - shmosel
@Anil 但是我需要访问ClassBase的其他方法和字段。我必须扩展这个类。 - Franckyi
@shmosel 我可以这样做。但是我希望我的接口能够与所有继承ClassBase类的类一起使用,而不仅仅是ClassBase本身。 - Franckyi
显示剩余4条评论
1个回答

3
如果类层次结构中有一个具有相同签名的方法,则默认方法变得无关紧要。默认方法不能覆盖java.lang.Object中的方法。原因很简单,因为Object是所有java类的基类。因此,即使我们在接口中定义了Object类方法作为默认方法,它也是无用的,因为始终会使用Object类方法。这就是为什么为了避免混淆,我们不能有覆盖Object类方法的默认方法。
结论:默认方法不能覆盖实例方法。

好的,谢谢你提供的信息,这正是我所想的。 - Franckyi
当你引用某些内容时,应该包含一个指向来源的链接。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接