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(" ");
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。
最后,如果您向其他人寻求帮助,请在您的描述中指出异常抛出的位置,让他们更容易理解。
我收到此错误:
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(" ");
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。
最后,如果您向其他人寻求帮助,请在您的描述中指出异常抛出的位置,让他们更容易理解。