我想创建一个compareTo
方法,但它给了我一个错误。任何人都可以帮我这个吗?
package defaultpackage;
public class HuffmanEntry implements Entry<Integer, String> {
private String c;
private Integer freq;
public HuffmanEntry(String c, Integer freq){
this.c = c;
this.freq = freq;
}
@Override
public int compareTo(Integer arg0) {
if(getKey()<arg0){
return -1;
}else if(getKey()>arg0){
return 1;
}else{
return 0;
}
}
@Override
public Integer getKey() {
return freq;
}
这是我的错误:
Exception in thread "main" java.lang.ClassCastException: defaultpackage.HuffmanEntry cannot be
cast to java.lang.Integer
at defaultpackage.HuffmanEntry.compareTo(HuffmanEntry.java:1)
答案 0 :(得分:3)
&#34;证据质量存在严重问题。你提供了我们:
堆栈跟踪似乎表示异常是在HuffmanEntry.java
的第1行引发的,这是不可能的。
堆栈跟踪似乎表示您的代码正在尝试将HuffmanEntry
对象转换为Integer
中的compareTo
,但是(根据源代码)不可能发生在那种方法中。该方法中使用的所有对象都具有声明类型Integer
,并且没有明确的类型转换。
堆栈跟踪显示compareTo
是唯一的方法调用,这是不可能的。
(午餐前3件不可能的事情?不,不要买!)
简而言之,您向我们展示的证据并不真实。它已经被调整/破坏,并且无法解释。
请提供一个真实的(完整的和未经编辑的)堆栈跟踪,以及与您运行的编译代码精确匹配以生成堆栈跟踪的源代码。还有任何编译错误。
或者,向我们提供一个SSCCE,我们可以自己运行,以重现这种不可能的行为/证据。
查看您链接的代码,我想我理解一般问题......如果不是特定问题。
基本上,您要混合泛型和非泛型代码,并且(您必须)忽略生成的编译器有关未经检查的转换,使用原始类型等的警告。结果是没有报告Java编译时类型检查器应该拾取的错误。
例如,在MyHeap.java
中,您可以写:
private ArrayList<Entry> entryList;
但是Entry
实际上是一个通用接口,这意味着ArrayList实际上被解释为ArrayList<Entry<Object, Object>>
,其中Object
是与无界类型参数K
对应的原始类型, T
。现在int compareTo(K)
界面中有Entry
方法...原始类型签名为int compareTo(Object)
。
现在看看
if (entryList.get(i*2).compareTo(entryList.get(i*2+1))==-1){
请注意,您实际上正在调用Entry.compareTO(Object)
传递另一个Entry
作为参数。编译器说好了....因为它认为你在那时使用原始类型。但是如果你一直在使用泛型,那么编译器就会意识到你正在调用Entry<K, V>.compareTo(Entry<K, V>)
,其中泛型方法签名真的是Entry<K, V>.compareTo(V)
。那将被标记为编译错误。
我怀疑这也解释了这个奇怪的例外。 Java编译器添加了一些隐藏运行时类型转换,以确保JVM的核心运行时类型安全性不受损害。当其中一个运行时检查失败时,您会看到异常。之所以会发生这种情况,是因为您实际上忽略或抑制了编辑时间检查,这些检查应该告诉您编程错误。
无论如何,最重要的是你不应该忽略关于滥用泛型,未经检查的转换等的编译器警告。你这样做是危险的......在这种情况下,你被咬了。
答案 1 :(得分:0)
您实现Comparable以允许比较您的类对象,而不是比较不同的对象。
也许您想提供类似if(Integer x&gt; huffmanObject.getFreq())的用法?听起来更简单。