2013-03-28 33 views
0

我正在用Java編寫一個通用鏈接列表,並且除了一個問題外,其他所有工作都正常。將泛型返回類型與Java中的類似泛型變量進行比較

列表節點包含E類型的變量「數據」,並且在通用鏈接列表代碼中我也有一個類型爲E的變量「tempData」。數據類型E將由程序使用鏈接列表確定。

我想要做的是通過調用節點函數getData()從鏈接節點「data」中檢索變量並將其存儲在名爲tempData的變量中。

下面是當前的代碼:

tempData = firstNode.getData(); 

我的問題是,當編譯我得到的錯誤,說他們是「不兼容的類型」。我知道在運行時它們將是相同的數據類型,但是如何滿足它編譯的語法?

我試圖把代碼:

if(firstNode.getData() instanceof tempData.getClass()) 

但它並沒有爲所在班級應該是沒有方法允許被稱爲工作。我也嘗試了以下工作,但仍然收到原始編譯錯誤。

if((firstNode.getData()).getClass == tempData.getClass()) 

任何和所有幫助非常感謝,謝謝。

編輯3-28-13

tempData的聲明是「E tempData;」

firstNode的聲明是「private ListNode firstNode;」

firstNode中的數據聲明是「private E data;」它是由.getData()獲得的;

標題爲LinkedList類「公共LinkedList類E」

報頭爲:ListNode類「公共類ListNode E」

兩個ES在頭具有比周圍符號小於和更大的,他們只是發佈時沒有顯示。

+0

你可以添加到您的問題tempData和firstNode的聲明?會讓我更容易看到我懷疑的問題。 – Jules

+0

@Jules E tempData; 並在firstNode(和所有節點)私有E數據;這是由.getData()返回的。 – FreakyDan

+0

firstNode本身和它的getData()方法是如何聲明的? – Jules

回答

1

一個可能的答案將是存儲類對象列表,像這樣:

public MyList(Class<E> clazz) { 
    this.clazz = clazz; 
} 

... 

new MyList<E>(E.class); 

然後,您可以使用:

Class<E> clazz; 

然後在構造正確的對象初始化這個此類對象將對象投射到正確的類型:clazz.cast(firstNode.getData())

可能有更好的解決方案,但在最糟糕的情況下,這種方法是有效的。

+0

當您嘗試您的代碼時,我得到了幾個錯誤,所以我將它更改爲: Class c = tempData.getClass(); 只有問題是鑄造仍然不工作,因爲我得到以下錯誤 LinkedList.java:115:錯誤:不兼容的類型 tempData = c.cast(firstNode.getData());所以我嘗試鑄造兩個相同的類型,並得到 LinkedList.java:115:錯誤:意外的類型 c.cast(tempData)= c.cast(firstNode.getData()); ^ 我在做你打算犯的錯嗎? – FreakyDan

+0

我已經添加了一些解釋我的意思。這有幫助嗎? – Jules

+0

我很想嘗試你寫的東西,但是因爲這是爲其提供了UML圖的任務,所以我不允許更改構造函數的參數 – FreakyDan