当前位置: 首页 > news >正文

在 Java 中提供接口方法而不是实现接口

问题

我正在阅读有关Java中的接口的文章。其中提到我们必须实现compareTo方法才能在ArrayList容器上调用sort,例如Employee类应该实现 Comparable接口。

后面解释了为什么Employee类不能简单地提供compareTo方法而不实现Comparable接口?之所以需要接口,是因为Java编程是强类型的。在进行方法调用时,编译器需要能够检查该方法是否确实存在。

因此,当我不实现Comparable接口并使用Arrays.sort方法时,我预计会出现编译时错误,但我没有观察到编译错误,而是得到了运行时错误。请解释为什么上述场景中没有显示编译时错误

以下是代码片段

package com.vrk.inheritance;import java.time.*;
import java.util.Arrays;public class Employee
{private String name;private double salary;private LocalDate hireDay;public Employee(String name, double salary, int year, int month, int day){this.name = name;this.salary = salary;hireDay = LocalDate.of(year, month, day);}public String getName(){return name;}public double getSalary(){return salary;}public LocalDate getHireDay(){return hireDay;}public void raiseSalary(double byPercent){double raise = salary * byPercent / 100;salary += raise;}/*public int compareTo(Object otherObject) {System.out.println("Employee compareTo called");return 0;}*//*** equalTo function in employee. Created on 8th Sep 2024* @param another object to compare to this object*/public boolean equals(Object otherObject) {// quick test to check if objects are identicalif ( this == otherObject) return true;// must return false if the explicit parameter is nullif(otherObject == null) return false;// if the classes don't match, they can't be equalif (getClass() != otherObject.getClass()) return false;// now we know otherObject is a non-null Employeevar other = (Employee) otherObject;// test whether the fields have identical value// Not sure in my setup below line is not working, but online compiler it is working. // java.util.Objects.equals(this.hireDay, other.hireDay);return true;}public static void main(String[] args) {var staff = new Employee[3];// fill the staff array with Manager and Employee objectsstaff[0] = new Employee("Harry Hacker", 50000, 1989, 10, 1);staff[1] = new Employee("Tommy Tester", 40000, 1990, 3, 15);staff[1] = new Employee("Ravi Tester", 60000, 1999, 4, 16);Arrays.sort(staff);}
}

解答

如果你看一下的文档Arrays.sort,你会发现它根本没有使用泛型;它只需要一个Object[]。这就是为什么你不会收到编译错误的原因。

这是出于历史原因:该方法是在Java引入泛型之前编写的

如果我们必须能够调用在类中实现的方法,为什么我们还必须实现接口?

因为该方法必须进行一些非平凡的反射。将Object转换为Comparable要容易得多,而且正如您所指出的,这更符合Java的类型系统理念。从本质上讲,Java不实现鸭子类型。

http://www.lryc.cn/news/447148.html

相关文章:

  • 伪类选择器
  • 亚信安全天穹5分钟勒索体检 免费试用今起上线
  • 高校竞赛管理系统的设计与实现
  • 物联网行业中通信断线重连现象介绍以及如何实现
  • 新手上路:Anaconda虚拟环境创建和配置以使用PyTorch和DGL
  • centos7系统安装宝塔面板
  • 汽车总线之----J1939总线
  • 基于skopt的贝叶斯优化基础实例学习实践
  • OJ在线评测系统 后端 用策略模式优化判题机架构
  • element ui 精确控制日期控件 date-picker
  • centos7安装指定版本php及扩展
  • 后端-对表格数据进行添加、删除和修改
  • 【学习笔记】手写 Tomcat 七
  • QT开发:详解 Qt 多线程编程核心类 QThread:基本概念与使用方法
  • 【芋道源码】gitee很火的开源项目pig——后台管理快速开发框架使用笔记(微服务版之本地开发环境篇)
  • 设计模式、系统设计 record part01
  • 服务器与普通电脑的区别是什么?
  • Vue3学习(六)Vue3 + ts几种写法
  • 【前端】ES6:Proxy代理和Reflect对象
  • 基于微信开发助手企鹅音乐微信小程序的设计与实现(源码+文档+讲解)
  • 学习Spring Boot,应该从哪里开始学起
  • 【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题
  • 企微群管理软件:构建高效社群运营的新引擎
  • CORE 中间件、wwwroot
  • SpringBoot 与 Maven 快速上手指南
  • 大觅网之自动化部署(Automated Deployment of Da Mi Network)
  • 【C++】入门基础知识-1
  • Redis一些简单通用命令认识常用数据类型和编码方式认识Redis单线程模型
  • 使用电子模拟器 Wokwi 运行 ESP32 示例(Arduino IDE、VSCode、ESP32C3)
  • C嘎嘎入门篇:类和对象(1)