【问题标题】:Problem with implementing Comparable interface实现 Comparable 接口的问题
【发布时间】:2020-08-01 23:21:35
【问题描述】:

我有以下代码,我在“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 在加载器“bootstrap”的模块 java.base 中) 在 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

【问题讨论】:

    标签: java interface comparable


    【解决方案1】:

    要使 Arrays.sort(accounts2) 函数正常工作,您的 BankAccount 类必须实现 jdk 本身提供的 Comaparable 接口 - java.lang.Comparable。 不是你创建的那个。

    从您的 BankAccount 类中删除以下代码。这将起作用。

    interface Comparable{
    int compareTo(Object otherObject);
    

    }

    【讨论】:

      【解决方案2】:

      摆脱:

      interface Comparable{
          int compareTo(Object otherObject);
      }
      

      因为您通过创建自己的接口来掩盖同名的核心 Java 接口,从而混淆了编译器。而是使用核心 Java Comparable 接口。

      这里的问题是Arrays.sort(...) 方法必须使用核心接口,而不是你自己的。否则您的代码可能可能会工作,但可能会混淆其他编码人员,更重要的是您未来的自己

      旁注,我建议使用通用版本的界面。我也喜欢always在我认为我可能覆盖的任何方法上方添加@Override注释,以便编译器会为我测试并在编译时警告我时间:

      public class BankAccount implements Comparable<BankAccount>, Measurable {
      
          @Override
          public int compareTo(BankAccount other) {
              // ....
          }
      

      【讨论】:

        猜你喜欢
        • 2022-07-08
        • 2014-07-05
        • 2015-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-19
        • 1970-01-01
        相关资源
        最近更新 更多