簡體   English   中英

實現 Comparable 接口的問題

[英]Problem with implementing Comparable interface

我有以下代碼,我在“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 class 中提供了 compareTo 方法,為什么它不起作用?

Exception in thread "main" java.lang.ClassCastException: class Inheritance.BankAccount cannot be cast to class java.lang.Comparable (Inheritance.BankAccount is in unnamed module of loader 'app'; java.lang.Comparable is in module java. 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 可比接口。

這里的問題是Arrays.sort(...)方法必須使用核心接口,而不是你自己的。 否則你的代碼可能會工作,雖然可能會混淆其他編碼人員,更重要的是你未來的自我

旁注,我建議使用接口的通用版本。 我還喜歡總是在我認為我可能會覆蓋的任何方法上方添加@Override注釋,以便編譯器會為我測試並在編譯時警告我:

public class BankAccount implements Comparable<BankAccount>, Measurable {

    @Override
    public int compareTo(BankAccount other) {
        // ....
    }

To make work Arrays.sort(accounts2) function working, your BankAccount class has to implement the Comaparable interface provided by jdk itself - java.lang.Comparable. 不是你創建的那個。

從您的 BankAccount class 中刪除以下代碼。 這將起作用。

interface Comparable{
int compareTo(Object otherObject);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM