接口中解决默认方法冲突​

如果先在一个接口中将一个方法定义为默认方法,然后又在超类或者另一个接口中定义了同样的方法,那么同时实现这两个接口的类或者既继承了超类又实现了接口的类就会发生冲突。但Java提供相应的规则:
1.超类优先。如果超类提供一个具体方法,同名而且有相同参数类型的默认方法会被忽略。
2.接口冲突。如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型相同的方法,就必须解决冲突。

例子

1.假设Person是一个类(有getName方法),Named是一个接口

interface Named{
    default String getName(){
        return getClass().getName()
    }
}

有一个类Student继承了Person和实现了Named接口:
class Student extends Person implements Named{...}
在这种情况下,只会考虑超类方法,接口的所有默认方法都会被忽略。接口可添加默认方法在Java SE 8中才有,使用“类优先”原则可以确保Java SE 7的兼容性,如果为一个接口添加默认方法,这对于有这个默认方法之前能正常工作的代码不会有任何影响。

2.假设Person是一个接口(默认实现了getName方法),Named依旧是一个接口,类Student实现了这两个接口:
class Student implements Person,Named{...}
类会继承Person和Named接口中提供的两个不一致的getName方法,并不是从中选择一个,这样Java编译器就会报告一个错误,我们需要解决这个二义性。只需要在Student类中提供一个getName方法,在这个方法中,可以选择两个冲突方法中的一个:

class Student implement Person,Named{
    public String getName(){
        return Person.super.getName();
    }
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值