Проблема с реализацией Comparable интерфейса - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть коды ниже, которые я реализую в главе 9 формы в книге "Java для всех":

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);
    }
}

Однако это дал мне ошибку ниже с моим сопоставимым интерфейсом. Я уже предоставил метод CompareTo в классе BankAccount, почему он не работает?

Исключение в потоке "main" java .lang.ClassCastException: класс Inheritance.BankAccount не может быть приведен к классу java. lang.Comparable (Inheritance.BankAccount находится в безымянном модуле загрузчика 'app'; java .lang.Comparable находится в модуле java .base загрузчика 'bootstrap') в 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

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Избавьтесь от:

interface Comparable{
    int compareTo(Object otherObject);
}

Поскольку вы путаете компилятор, создав собственный интерфейс, который скрывает ядро ​​Java интерфейса с тем же именем . Вместо этого используйте базовый Java сопоставимый интерфейс.

Проблема здесь в том, что метод Arrays.sort(...) должен использовать основной интерфейс, а не ваш собственный. В противном случае ваш код может , возможно, работать, хотя, вероятно, запутает других кодеров и, что более важно, ваше будущее Я .

Примечание, я бы порекомендовал использовать версию generi c интерфейса. Мне также нравится всегда добавлять аннотацию @Override над любым методом, который, я думаю, я может переопределить, чтобы компилятор проверил это для меня и предупредил меня во время компиляции:

public class BankAccount implements Comparable<BankAccount>, Measurable {

    @Override
    public int compareTo(BankAccount other) {
        // ....
    }
0 голосов
/ 19 апреля 2020

Чтобы рабочая функция Arrays.sort (accounts2) работала, ваш класс BankAccount должен реализовать интерфейс Comaparable, предоставляемый самим jdk - java .lang.Comparable. Не тот, который вы создали.

Удалите приведенный ниже код из класса BankAccount. Это будет работать.

interface Comparable{
int compareTo(Object otherObject);

}

...