2012-11-21 43 views
1

我有一個方法,返回一個泛型類型的列表,方法如下所示。Java通用擴展返回的方法鑄造錯誤

protected <T extends SQLDataBean> List<T> getJavaListFromOracleArray(Array array) throws SQLException 

然後我有一個名爲ReplacementBean的對象,它擴展了SQLDataBean。

在另一類我有一個List<ReplacementBean>了一套方法以在List<ReplacementBean>

我發現,我不知道爲什麼我不能把裏面的設置上面列出的方法。這意味着編譯時錯誤:

setReplacements(this.getJavaListFromOracleArray(in.readArray())); 

但是,以下編譯和工作正常。

List<ReplacementsBean> temp = this.getJavaListFromOracleArray(in.readArray()); 
setReplacements(temp); 

我也嘗試在set方法內部施放如下內容,但它也有編譯時錯誤。

setReplacements((List<ReplacementsBean>)this.getJavaListFromOracleArray(in.readArray())); 

有什麼辦法可以在調用我的set方法之前不必做兩行設置臨時局部變量的過程?雖然它確實有效,但不必這樣做也不錯。

致電以下:

setReplacements(this.getJavaListFromOracleArray(in.readArray())); 

導致的setReplacements(List<ReplacementsBean>) is not applicable for the arguments List<SQLDataBean>

的setReplacements代碼錯誤如下:

public void setReplacements(List<ReplacementsBean> replacements) 
{ 
    this.replacements = replacements; 
} 

另外,如果我試試這個:

setReplacements((List<ReplacementsBean>)this.getJavaListFromOracleArray(in.readArray())); 

我收到錯誤無法投射從List<SQLDataBean>List<ReplacementsBean>

+0

請發佈錯誤 –

+0

同時顯示setReplacements的代碼。編輯爲 –

+0

以包含錯誤和setReplacements代碼。 – user1735869

回答

2

這是編譯器類型推斷不如您可能會喜歡的那種情況之一。下面應該工作,其中明確指定泛型方法類型參數:

setReplacements(this.<ReplacementsBean>getJavaListFromOracleArray(in.readArray())); 

在一個臨時變量的情況下

List<ReplacementsBean> temp = this.getJavaListFromOracleArray(in.readArray()); 
setReplacements(temp); 

編譯器被強制實例<T><ReplacementsBean>,使分配工作。

+0

所以答案是,由於編譯器如何解釋我必須對臨時變量執行兩步操作。 – user1735869

+0

@ user1735869或使用顯式的'this。 getJavaList ...'語法。 –

0

的問題是,編譯器裏面以下完成:

List<X> temp = getJavaListFromOracleArray(in.readArray()); 
setReplacements(temp); 

其中X必須ReplacementsBean或其子女。這是開放式的。在許多更正式的類型語言中,X被解析,而不是java。因此,需要:

setReplacements(<ReplacementsBean>getJavaListFromOracleArray(in.readArray())); 

然而這個「缺陷」也是明確症狀:大概getJavaListFromOracleArray確實不安全的仿製藥。

還要注意,函數setReplacements可能會在子類中被覆蓋,參數爲a List<ReplacementsBeanChild>