Java的Comparable接口

Comparable接口

接口

什么是接口?
接口不是类,是对类的以组需求描述。

接口怎么定义?
1)关键字 interface
2)接口中的方法和域,全部都默认为 public static final,可不必提供关键字,所以说接口没有实例域

接口怎么实现?
用类来实现接口:
1)将类声明为实现给定的接口,使用关键字 implement
2)对接口中的所有方法进行定义
3)和抽象方法一样,接口也没有实例,但是可以有接口变量,但他必须引用实现了他的类的对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E3Wcjs95-1585748259916)($resource/1584762399(1)].jpg)

comparable接口

任何实现了Comparable接口的类都需要包含compareTo方法,并且这个方法的参数必须是一个Object对象,返回一个整数值

public interface Comparable
{
    int compareTo(Object other);
}

或者使用新的comparable接口,他是一个泛型的类习惯

public interface Comparable<T>
{
    int compareTo(T other);
}

新旧方法对比:不适用泛型则需要收栋讲compareTo方法的参数强制转换为所希望的类型。

旧方法例子:

public int compareTo(Object otherObject)
{
    Employee other (Employee)otherObject;//手动转型,向下造型,强制转换
    return Double.compare(salary,other.salary);
}

新方法例子:

public int compareTo(Employee otherEmployee)
{
    return Double.compare(salary,otherEmployee.salary);//不需要转型
}

接口的默认方法
为接口方法提供一个默认实现,用default修饰

public interface Comparable<T>
{
    default int compareTo(T other){//关键字default修饰
    return 0;
    }
}

默认方法可以调用任何其他方法

public interface Collection
{
    int size();//一个抽象方法
    default boolean isEmpty(){
    return size() == 0;
    }
}

Comparable的每一个实际实现依旧可以覆盖这个默认方法。

什么时候需要使用这种默认方法?
比如指定了一个功能”搬砖“,10个里面有八个是“搬砖”,只有两个是“活水泥”,我就可以用一个default默认接口方法,只要我不修改他,他就是”搬砖“,而有个别需要修改的,我才修改它为“活水泥”,“运沙子”等等别的功能。

解决默认方法冲突

情况一:父类和接口拥有完全相同的方法,一个子类同时继承了父类又实现了接口
情况二:父类和接口拥有方法签名相同,但返回值不同的方法,一个子类同时继承了父类又实现了接口
情况三:两个接口拥有完全相同的方法,一个类同时实现了两个接口
情况四:两个接口拥有相同方法签名,但返回值不同的方法,一个类同时实现了两个接口

Java解决二义性的规则:
1)超类优先。如果超类提供了一个具体方法,接口中同名且又相同类型参数的方法会被忽略。
2)接口冲突。两个接口提供了同名同参数列表的相同方法,必须覆盖这个方法来解决。
3)不允许一个类同时继承和实现,或者同时实现两个方法签名相同,但是返回值不同的方法,因为那样根本无法解决掉二义性的问题。或者不使用implement实现,使用lambda表达式实现接口可以使用不同接口中的完全相同的方法

解决方法:
情况二和情况四,无法解决二义性问题,一个函数中不能存在方法签名相同,返回类型不同的函数
情况一:父类优先,可以不必再实现这个接口,当然非要实现这个接口,等价于重写它父类的方法
情况三:选择其中一个进行覆盖就可以了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值