java.lang.ClassCastException:无法强制转换为java.lang.Integer

时间:2014-03-21 01:07:05

标签: java

我想创建一个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)

2 个答案:

答案 0 :(得分:3)

&#34;证据质量存在严重问题。你提供了我们:

  1. 堆栈跟踪似乎表示异常是在HuffmanEntry.java的第1行引发的,这是不可能的。

  2. 堆栈跟踪似乎表示您的代码正在尝试将HuffmanEntry对象转换为Integer中的compareTo,但是(根据源代码)不可能发生在那种方法中。该方法中使用的所有对象都具有声明类型Integer,并且没有明确的类型转换。

  3. 堆栈跟踪显示compareTo是唯一的方法调用,这是不可能的。

  4. (午餐前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())的用法?听起来更简单。