Java接口的默认方法冲突

简介

作者简介:青铜码农,和大多数同学一样从零开始一步步学习,一步步积累。期待您的关注,让我们一起成长~注:本人学疏才浅,文章如有错误之处,敬请指正~

本章节内容简介:两个接口默认方法冲突

参考来源《Java核心技术 卷1》

   如果先在一个接口中将一个方法定义为默认方法,然后又在超类或另一个接口中定义了同样的方法,会发生什么情况?编译器将会报告一个错误:二义性错误。

   对此Java提供了两个解决规则:

1.超类优先

   一个类扩展了一个超类(父类),同时实现了一个接口,并从超类和接口继承了相同的方法。例如下面这个例子:

interface Named {
    default String getName() {
        return "这是接口的默认实现";
    }
}
​
public class Test extends Animal implements Named {
    public static void main(String[] args) {
        Test d = new Test();
        System.out.println(d.getName());
    }
}
​
class Animal {
    public String getName() {
        return "这是超类的方法";
    }
}
输出结果:
这是超类的方法

  这种情况下只会考虑超类方法,接口的所有默认方法都会被忽略。这就是“类优先”规则。

 “类优先”规则可以确保Java7的兼容性。如果为一个接口增加默认方法,这对于有这些默认方法之前能正常工作的代码不会带来任何影响。

  注意:千万不能让一个默认方法重新定义Object类中的某个方法。例如,不能为toString或equals定义默认方法,因为“类优先”的规则,这样的方法绝对无法超越祖宗类Object。

2.有接口冲突的情况

  如果一个接口已经提供了一个默认方法,另一个接口还继续提供一个同名且参数类型(不论是否是默认参数)相同的方法,必须覆盖这个方法来解决问题

  下面将通过一个例子进行说明。

public class Test implements Animal,Named{
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(t.getName());
    }
}
interface Animal {
    default String getName() {
        return "";
    }
}
​
interface Named {
    default String getName() {
        return getClass().getName() + "_" + hashCode() + "    Named";
    }
}

这时编译器将会报告一个错误:

解决这个错误很简单:

只需要在Test类中覆盖重写getName()方法,Animal和Named二选一即可。

@Override
public String getName() {
    return Animal.super.getName();
}
//或者
@Override
public String getName() {
    return Named.super.getName();
}

  那假设现在Named接口没有为getName提供默认实现(Animal还是保留default),Test类还会从Animal接口继承默认方法吗?

  答:两个接口如何冲突不重要,但是如果至少有一个接口提供了一个默认实现,编译器就会报错,就必须解决这个二义性。当然,如果两个接口都没有为共享方法提供默认实现,那么就与Java8之前的情况一样,不存在冲突。实现类可以有两个选择:要么实现这个方法,要么直接不实现,如果不实现,这个类本事就是抽象的。

点个赞再走吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Waylon1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值