2013-06-20 58 views
5

在這段代碼中,我使用java實現了一個通用鏈表。未經檢查在Java中拋出警告?

public class LL<Item extends Comparable<Item>> { 

我的節點類的定義如下

private class Node{ 
private Item data; 
private Node next; 
public Node(Item data){ 
    this.data = data; 
    next = null; 
} 
} 

現在我的疑問是,我把編碼

Node x = head, y = (Node) b.head; 
Type safety: Unchecked cast from LL.Node to LL<Item>.Node 

我應該忽視這個時候得到警告,爲什麼編譯器生成。它有一個解決方法嗎?

編輯:

b爲類型LL的,函數簽名看起來像

public void mergeAlternate(LL b){ 

和頭部是LL級

private Node head; 
+0

'@SuppressWarnings(「unchecked」)' – NINCOMPOOP

+12

@TheNewIdiot他應該理解**爲什麼會發生警告,而不是盲目地壓制它。如果這是一個答案,它會立即從我-1。 –

+3

'b'和'b.head'的類型是什麼? –

回答

3

如果你是一個私有的實例變量創建一個通用的實現,那麼它也應該是內部通用的。

您缺少Node類的類型參數。你在哪裏使用類,你可以做這樣的事情

private class Node<T extends Comparable<T>> { 
    private T data; 
    private Node<T> next; 
    public Node(T data){ 
     this.data = data; 
     next = null; 
    } 

} 

而且:

new Node<Item> // ...

您的代碼看起來就像這樣:

Node<Item> x = head, y = b.head; 
它應該是通用這樣的

而且你不會以這種方式得到警告。

但是我的蜘蛛感覺告訴我那裏有一些建築問題。既然你沒有向我們展示你的所有代碼,我們無法進一步幫助你。

+1

'T延伸可比較的'? –

+1

如果你理解代碼,看起來像'Node'是'LL'類中的一個內部類,爲了使它工作,你應該將它標記爲'static'並且只需要'Node '。有了這個,你只需要聲明'Node 節點;'沒有問題的變量。 –

+0

它不應該是'static',因爲如果沒有'LL'的實例,他不會使用它。我用'T'而不是'Item'。我也可以使用'ITEM',但使用'Item'作爲類型參數名稱會將其與實際類型名稱混淆。 –

相關問題