Java:使用优先级队列的运行时ClassCastException&定制课程?

时间:2017-07-11 09:03:40

标签: java

import java.util.*;
public class Lab72 {
    public static void main(String[] args) {
        Queue que= new PriorityQueue();
        que.add(new Hello(3));
        que.add(new Hello(23));
        que.add(new Hello(7));
        que.add(new Hello(67));
        que.add(new Hello(39));
        System.out.println(que);

        class Hello implements Comparable {
            int x;

            Hello(int x){
                this.x=x;
            }

            public String toString() {
                return "" + x;
            }

            public int compareTo(Object obj) {
                if(obj instanceof Hello) {
                    Hello h1= (Hello)obj;
                    return this.x-h1.x;
                }
                return 0;
            }
        }
    }
}

我在运行时遇到以下错误:

 Exception in thread "main" java.lang.ClassCastException:     Hello       cannot be cast to java.lang.Comparable
at java.util.PriorityQueue.siftUpComparable(Unknown Source)
at java.util.PriorityQueue.siftUp(Unknown Source)
at java.util.PriorityQueue.offer(Unknown Source)
at java.util.PriorityQueue.add(Unknown Source)
at Lab72.main(Lab72.java:6)

第6行是que.add(new Hello(23));

构造函数的使用有什么问题吗?由于Hello是一个自定义类,我提供了Comparable接口,compareTo()和toString()方法都被重写。

1 个答案:

答案 0 :(得分:3)

你不应该使用原始类型。

尝试:

class Hello implements Comparable<Hello>
{
    int x;
    Hello(int x){
        this.x=x;
    }
    public String toString() {
        return ""+x;
    }
    public int compareTo(Hello obj) {
        return this.x-obj.x;
    }
}

同时更改

Queue que= new PriorityQueue();

Queue<Hello> que= new PriorityQueue<Hello>();