Java runtime error: java.lang.ClassCastException: main.Scrapper$aktie cannot be cast to java.lang.Comparable

Java runtime error: java.lang.ClassCastException: main.Scrapper$aktie cannot be cast to java.lang.Comparable

我收到此错误:

java.lang.ClassCastException: main.Scrapper$aktie cannot be cast to java.lang.Comparable

当我尝试创建一个我自己定义的 class 时。我能做些什么来修复它?数据总是正确的类型,所以这不是问题,我试图在将它们放入 class 之前将它们解析为变量,但我仍然得到相同的错误

package main;

import java.util.ArrayList;
import java.util.PriorityQueue;

import javax.swing.JOptionPane;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class Scrapper extends Thread {

    private String address;
    private ArrayList<String> name;
    private ArrayList<String> ranInfo;
    public PriorityQueue<aktie> aktier;
    public boolean runner;

    public Scrapper(String webAddress) {
        address = webAddress;
        runner = true;
    }

    public class aktie {
        public aktie(String aktieNamn, float senaste, float sIP, float eÅP, int totBV, float esK, float dA, int aÄ, String börsNamn) {
            this.namn = aktieNamn;
            this.senaste = senaste;
            this.skillnadIProcent = sIP;
            this.ettÅrProcent = eÅP;
            this.totalBörsvärde = totBV;
            this.enskildKostnad = esK;
            this.direktAvkastning = dA;
            this.antalÄgare = aÄ;
            this.vilkenBörs = börsNamn;
            this.newAktie = true;
        }
        public String namn;
        public float senaste;
        public float skillnadIProcent;
        public float ettÅrProcent;
        public int totalBörsvärde;
        public float enskildKostnad;
        public float direktAvkastning;
        public int antalÄgare;
        public String vilkenBörs;
        public boolean newAktie;

        public boolean equal(aktie input) {
            if  (input.namn.equals(namn) && 
                input.senaste == senaste && 
                input.skillnadIProcent == skillnadIProcent &&
                input.ettÅrProcent == ettÅrProcent &&
                input.totalBörsvärde == totalBörsvärde &&
                input.enskildKostnad == enskildKostnad &&
                input.direktAvkastning == direktAvkastning &&
                input.antalÄgare == antalÄgare &&
                input.vilkenBörs.equals(vilkenBörs)) {
                return true;
            }
            return false;
        }
    }

    public void run() {
        name = new ArrayList<String>();
        ranInfo = new ArrayList<String>();
        aktier = new PriorityQueue<aktie>();
        while(runner) {
            Document namnSidan = null;
            Document sidan = null;
            try {
                namnSidan = Jsoup.connect(address).get();
                sidan = Jsoup.connect(address).get();
            } catch(Throwable t) {
                Start.log(t.toString());
            }
            Elements nmList = namnSidan.select("td");//td, table
            for(int i = 0; i < nmList.size(); i++) {
                String[] temper = nmList.get(i).toString().split("</span>");
                if(temper.length > 1) {
                    String[] tm = temper[1].split(" </a>");
                    if(!tm[0].equals(" </td>") && tm.length > 1) {
                        name.add(tm[0]);
                    }
                }
            }
            Elements values = sidan.select("td");
            for(int i = 1; i < values.size(); i++) {
                String[] splitted = values.get(i).toString().split(" </span>");
                String[] fixed = splitted[0].split(">");
                if(!fixed[fixed.length-1].equals("</td") && !fixed[fixed.length-1].equals(" </td")) {
                    String rätt = fixed[fixed.length-1].substring(1, fixed[fixed.length-1].length());
                    String[] pars = rätt.split("&nbsp;");
                    if(1 < pars.length) {
                        ranInfo.add(pars[0] + pars[1]);
                    } else if(rätt.equals("-")) {
                        ranInfo.add("0.0f");
                    } else {
                        String[] cutt = rätt.split(",");
                        if(cutt.length > 1) {
                            ranInfo.add(cutt[0] + "." + cutt[1]);
                        } else {
                            ranInfo.add(rätt);
                        }
                    }
                }
            }
            int counter = 0;
            for(int i = 0; i < name.size(); i++) {
                aktier.add(new aktie( //<- error happens here
                        name.get(i), 
                        Float.parseFloat(ranInfo.get(counter++)), 
                        Float.parseFloat(ranInfo.get(counter++)), 
                        Float.parseFloat(ranInfo.get(counter++)), 
                        Integer.parseInt(ranInfo.get(counter++)), 
                        Float.parseFloat(ranInfo.get(counter++)), 
                        Float.parseFloat(ranInfo.get(counter++)), 
                        Integer.parseInt(ranInfo.get(counter++)), 
                        ranInfo.get(counter++)));
            }
            try {
                Thread.sleep(120000);
            } catch(Throwable t) {}
        }
    }
}

首先,你不应该实现类似 "public boolean equal(aktie input)" 的东西,而是覆盖现有的 equals(Object obj) 方法。

其次,您需要在 aktie 上实现 comparable,因为 priorityQueue 需要一个 Comparable 实现,或者,如果您不想这样做,您必须实现一个 Comparator 并将其提供给您的 PriorityQueue。

第三,如果您打算使用货币值,请不要使用 float 或 double,因为它们只是近似值!!!使用 int、long 或 BigDecimal。

最后,如果您向其他人寻求帮助,请在您的描述中指出异常抛出的位置,让他们更容易理解。