2013-03-30 37 views
0

我有一個簡單的問題。實現特定類的LinkedList而不是泛型

我正在定義一個使用由我自己定義的鏈接節點作爲嵌套類的類。

我只想使用此節點的ArrayLists的字符串的節點,而不是一般類型。

我定義了一個通用類型T的節點,即HNode < T>,但我想在使用ArrayList方法的Node類上添加方法。例如,

public void forward(int n) { //return boolean?? 
     HNode<T> targetNode; 
     for(int i=0; i<n; i++) { 
      targetNode = this._next; 
     } 
     targetNode._datum.add(this._datum.remove(this._datum.size()-1)); 
    } 

在我的Node類中。

它一直給出警告:方法size()對於T類型是未定義的,這就是爲什麼我正在考慮將類定義更改爲String的ArrayList的Node。

(第一個問題是這樣的:) 這是正確的方法,還是有沒有更好的方法來做到這一點? 或者我可以忽略警告,只要我使用

另一個問題是這樣的。 我聲明瞭變量targetNode,並將其分配給for循環。 但是,它會引發targetNode需要分配的警告。

public void forward(int n) { //return boolean?? 
     HNode<T> targetNode = this; 
     for(int i=0; i<n; i++) { 
      targetNode = targetNode._next; 
     } 
     targetNode._datum.add(this._datum.remove(this._datum.size()-1)); 

這可能是更好的選擇嗎?

謝謝!

回答

1

有更好的方法來做到這一點!

既然你希望使用Arraylist.size()方法,我建議讓您的節點(幷包圍類)的類型Collection接口。

Collection接口保證該對象將實現一個.size()方法,這將消除您的編譯錯誤。從Collection

Arraylist繼承如下:
Collection-->AbstractList-->Arraylist

使用Collection到位通用T通過你的類:

HNode<Collection> targetNode; 

這將使你的類來處理所有類它實現了Collection接口,這是一個廣泛的類秒。這將保持你的抽象和顯著更增加了代碼的可重用性,然後全班承諾只有Arraylist

+0

我定義了我的類\t private class HNode { 我想這可能會工作? – user25409

+0

@ user25409定義這樣的私有類:'HNode ' –

0

「我只是想用這個節點的節點字符串的ArrayList,而不是一個通用型」

然後創建你的類型那樣,刪除通用,用途:HNODE代替HNode<T>

並創建一個類型爲Arraylist<String>的字段。

+0

你的意思是HNode >?這不起作用,這就是爲什麼我問這個問題。 – user25409

+0

對不起仍然在編輯我的答案,現在它更好:),這是否符合您的需求? – bluevoid

0

爲了能夠List接口的使用方法,你只需要更換

HNode<T> 

HNode<List> 

出現警告「targetNode需要分配」,因爲如果n = 0,for循環將不會執行。那就是爲什麼targetNode可能不被分配。而這就是爲什麼你shuld添加範圍檢查或者你可能會得到的NullPointerException這行

targetNode._datum.add(this._datum.remove(this._datum.size()-1)); 

編輯:此外,它看起來像你的最後一行是邏輯上不正確。 remove()方法返回操作的結果(boolean),而不是被移除的對象本身。您需要在刪除之前顯式獲取此元素,或者將收集更改爲LinkedList並調用removeLast()方法。

+0

回覆'編輯:':我檢查了Javadoc,並且有兩種刪除方法。 remove()返回布爾值,remove(int index)返回移除的對象。 – user25409

+0

是的,我混淆了瀏覽器選項卡,並查看到集合接口javadoc而不是List。對不起,這個錯誤。但這就是你應該使用List接口的原因,而不是@awashburn建議的Collection。 –

相關問題