2017-07-11 27 views
1
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; 
      } 
     } 
    } 
} 

我在運行時收到以下錯誤:Java:使用優先級隊列和自定義類的運行時ClassCastException?

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(新的Hello(23));

構造函數的用法有什麼問題嗎?由於Hello是一個自定義類,我提供了Comparable接口,compareTo()和toString()方法都被覆蓋。

+1

您的源不是編譯:類'Hello'是一種方法裏面,而且被聲明**後**您嘗試使用它......但是,如果我將它放在'Queue'行之前,它也會編譯並運行。結果:'[3,23,7,67,39]' –

回答

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>();