2013-03-21 64 views
1

儘管花了大量的時間搜索一個答案,我的困境和重新閱讀我的Java教科書中泛型的一章,似乎無法修復問題下面的代碼:Java:「使用未經檢查或不安全的操作。使用...重新編譯」

public class RedBlackTree<I extends Comparable> 
{ 
    private int count = 0; 
    private RedBlackNode root; 

    private RedBlackNode current; 
    private RedBlackNode[] stack; 

    /** 
    * Inner class used for representing the nodes of the red-black balanced binary search tree object. 
    */ 
    private class RedBlackNode implements Comparable 
    { 
     private I id; 
     private boolean is_btree; 
     private RedBlackNode[] links; 

     /** 
     * Constructor for objects of the RedBlackNode class. 
     * 
     * @param id The ID of the node. 
     */ 
     private RedBlackNode(I id) 
     { 
      if (id == null) 
      { 
       throw new NullPointerException("ID cannot be null."); 
      } 

      this.id = id; 
      this.is_btree = true; 
     } 

     /** 
     * Function for comparing the RedBlackNode object to another object. 
     * 
     * @param obj The object to be compared. 
     * @return If invocant > passed, returns 1; if invocant < passed, returns -1; if invocant = passed, returns 0. 
     */ 
     private int compareTo(Object obj) 
     { 
      if (obj instanceof RedBlackTree.RedBlackNode) 
      { 
       RedBlackNode node = (RedBlackNode)obj; 

       int result = id.compareTo(node.id); 

       return result > 0 ? 1 : result < 0 ? -1 : 0; 
      } 
      else 
      { 
       throw new ClassCastException("Expected a RedBlackNode object."); 
      } 
     } 
    } 
} 

特別是,我收到一個彈出以下消息:

Warnings from last compilation 

C:\Users\...\RedBlackTree.java uses unchecked or unsafe operations. 
Recompile with -Xlint:unchecked for details. 

幾乎所有的我在這裏組合或類似的還有導致這樣的彈出窗口。我正在使用BlueJ環境進行編程,這使得無法合併相關編譯器參數以查看任何細節。

據我迄今爲止從我的研究中可以看出,這與內部類使用I泛型類型以及「RedBlackNode實現Comparable」以及RedBlackNode內部類中的compareTo方法需要相關以某種方式與這個事實相抗衡。

我知道這個問題已經在stackoverflow和其他地方問過了,並且回答了很多次,但我似乎無法將從這些實例中學到的東西應用到我的案例中。我對泛型非常新,所以我可以得到的任何幫助將非常感謝!

回答

2

做如下修改

public class RedBlackTree<I extends Comparable<I>> 

private class RedBlackNode implements Comparable<RedBlackNode> 

    @Override 
    public int compareTo(RedBlackNode node) 
      int result = id.compareTo(node.id); 
      return result > 0 ? 1 : result < 0 ? -1 : 0; 

在刪除的compareTo類型檢查。介意公衆,因此始終使用@Override

+0

謝謝!其他答案當然有幫助,但這個答案解決了所有問題(包括注意到重寫compareTo函數的公共/私人困境,我認爲這可能會導致一個問題,但沒有人提到過)。 – sweetname 2013-03-21 11:21:10

2

Comparable需要一個類型參數。編譯器抱怨,因爲你沒有提供它。

+0

是的,但即使我提供一個類型(例如),我仍然遇到各種問題... – sweetname 2013-03-21 10:57:09

+0

您的代碼中有兩個地方使用Comparable而沒有類型信息。你有沒有嘗試在兩個地方添加類型信息?如果你在你嘗試過的東西上添加了例子,這將會很有用。 – NilsH 2013-03-21 10:59:52

+0

當我輸入「class RedBlackNode implements Comparable 」時,我仍然收到警告。此外,這是「公開課RedBlackTree」我擴展Comparable >「更好的外部類聲明? – sweetname 2013-03-21 11:02:10

2

該警告是因爲您正在使用原始類型Comparable而不是給它一個類型參數。你所要做的就是改變類定義

public class RedBlackTree<I extends Comparable<I>> 

private class RedBlackNode implements Comparable<RedBlackNode> 

,並相應地調整compareTo()方法(這實際上將其簡化顯着,因爲你不需要類型檢查和鑄造了)。

+0

好的,那實際上是我現在所擁有的(減去compareTo()方法的「調整」)。你會如何建議我去「調整」它?這是適當的:「private int compareTo(RedBlackNode obj)」?現在(通過調整)我仍然收到警告,並指向「私人類RedBlackNode實現了Comparable 」。 – sweetname 2013-03-21 11:04:30

相關問題