2012-02-21 33 views
2

我不知道爲什麼下面的代碼不能工作:無法分配給<T擴展INode>類型變量的INode類型值。爲什麼?

public static <T extends INode> List<T> cloneList(List<T> list) { 
    List<T> result = new ArrayList<T>(list.size()); 

    for (T t : list) 
     result.add(t.clone()); <--- problem here 

    return result; 
} 

INode.clone()INode返回類型,而我們知道,每個T必須實現INode,所以我很驚訝上面的代碼不能編譯。上面顯示的內容是否有語義問題?

編輯:也許是因爲在編譯時Java將擦除泛型類型,然後仍然需要一個演員?編譯器不能爲我做這件事嗎?

EDIT2:這裏是INode

public interface INode { 
    INode accept(Visitor visitor); 
    INode clone(); 
} 

感謝

回答

3

T是一個inode,但inode不是T. 所以你不能把INode.clone()(對象或i節點)的結果爲T. 名單這就是爲什麼你需要一個投

Regards

0

首先,我想這inode是一個接口,是因爲它是在對象中定義的clone()方法不應該用於直接。你應該在界面中定義一個clone()方法,或者讓INode擴展Cloneable,然後將克隆的節點轉換爲T.

此外,當你寫我時,你需要將你的克隆對象轉換爲T,因爲你知道T和克隆將inode的實例,但你不知道的是,克隆是T.

的實例
0

首先,我懷疑在INode類,你有沒有重新申報的clone方法和實現接口Cloneable

另外,爲了將克隆插入到參數化列表中,需要強制轉換爲T

相關問題