java - 实现 Comparable 接口的问题
问题描述
我有以下代码,我在“Java for Everyone”一书中实现了第 9 章:
package Inheritance;
import java.util.Scanner;
interface Comparable{
int compareTo(Object otherObject);
}
interface Measurable{
double getMeasure();
}
public class BankAccount implements Comparable, Measurable {
private double balance;
private int counter;
public String account;
public BankAccount(){
balance = 0;
counter = 0;
account = "";
}
public void SetAccount(String accountNumber, double amount){
account = accountNumber;
balance = amount;
}
public void Deposit(double amount){
balance = balance + amount;
counter = counter + 1;
System.out.println("Account: "+ account + " has balance: " + balance);
}
public void Withdraw(double amount){
balance = balance - amount;
counter = counter + 1;
System.out.println("Account: "+ account + " has balance: " + balance);
}
public double getBalance(){
return balance;
}
public void MonthEnd(){
counter = 0;
}
public void printMenu(){
System.out.println("Please choose your options to proceed: ");
System.out.println("D)eposit W)ithdraw M)onth end Q)uit");
}
public double getMeasure(){
return balance;
}
public int compareTo(Object otherObject) {
BankAccount other = (BankAccount) otherObject;
if (balance < other.balance) {
return -1;
}
if (balance > other.balance) {
return 1;
}
return 0;
}
然后我运行它如下:
public class Implementation {
public static void main(String[] args) {
//Implement Comparable Interface example
BankAccount[] accounts2 = new BankAccount[3];
accounts2[0] = new BankAccount();
accounts2[0].SetAccount("SA001", 10000);
accounts2[1] = new BankAccount();
accounts2[1].SetAccount("SA001", 5000);
accounts2[2] = new BankAccount();
accounts2[2].SetAccount("SA001", 20000);
System.out.println(accounts2[0].compareTo(accounts2[1]));
Arrays.sort(accounts2);
}
}
但是,我的 Comparable 界面给了我以下错误。我已经在 BankAccount 类中提供了 compareTo 方法,为什么它不起作用?
线程“main”java.lang.ClassCastException 中的异常:无法将类 Inheritance.BankAccount 强制转换为类 java.lang.Comparable(Inheritance.BankAccount 位于加载程序“app”的未命名模块中;java.lang.Comparable 位于模块 java.lang.Comparable 中。 java.base/java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320) 的加载程序“引导程序”的基础
at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
at java.base/java.util.Arrays.sort(Arrays.java:1250)
at Inheritance.Implementation.main(Implementation.jav
解决方案
摆脱:
interface Comparable{
int compareTo(Object otherObject);
}
由于您通过创建自己的接口来混淆编译器,该接口隐藏了同名的核心 Java 接口。而是使用核心 Java Comparable 接口。
这里的问题是该Arrays.sort(...)
方法必须使用核心接口而不是您自己的。否则你的代码可能会工作,虽然可能会混淆其他编码人员,更重要的是你未来的自我。
旁注,我建议使用接口的通用版本。我还喜欢总是@Override
在我认为我可能会覆盖的任何方法上方添加注释,以便编译器会为我测试并在编译时警告我:
public class BankAccount implements Comparable<BankAccount>, Measurable {
@Override
public int compareTo(BankAccount other) {
// ....
}
推荐阅读
- mono - 将 Mono 存储库添加到 Red Hat 7 服务器时出现问题
- docker - 无法通过 Docker 登录到在 Docker 中运行的 JFrog Artifactory
- python - 用同一行的另一个位置的字符串替换文件中一个位置的字符串-python
- microsoft-graph-api - Microsoft Graph API Teams ChatMessageAttachment 与 jpeg 图像失败
- xml - 如何有条件地验证允许的子元素列表中元素的存在?
- javascript - 使用 LazyLoad 时最大的 Contentful Paint 显着增加
- java - 如何使用 HTMLDocument 查找属性?
- docker - 使用 docker、docker-compose 和 makefile 反射 golang
- r - 如果输入是矩阵,如何并行计算?
- c# - 警告 CS8032 无法加载文件或程序集 'Microsoft.CodeAnalysis,版本 = 3.3.0.0