实现可比接口的问题

我有以下代码可以在“ 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方法,为什么它不起作用?

线程“主”中的异常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
windger2008 回答:实现可比接口的问题

摆脱:

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) {
        // ....
    }
,

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

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

interface Comparable{
int compareTo(Object otherObject);

}

本文链接:https://www.f2er.com/2407328.html

大家都在问