2013-03-01 108 views
2

我已經定義,像這樣一個TreeNode類:泛型與同一基類

class TreeNode<T extends MyClass> { 
    public T element; 
    public TreeNode<? extends MyClass> parent; 
    public ArrayList<TreeNode<? extends MyClass>> children; 
} 

我想知道是否有限制所有樹節點來擴展MyClass泛型類型變量更簡單的方法?不得不寫出ArrayList<TreeNode<? extends MyClass>>是非常乏味的。我不能只是做ArrayList<TreeNode<T>>,因爲那麼樹不能包含具有不同繼承MyClass的節點。

我試圖做這樣的事情: public static const Class NODE_CLASS = TreeNode<? extends TreeNode>.class;但我不認爲你可以使用泛型作爲類對象的一部分。

Someting synonym to C++'s typedef I guess,I.e. typedef TreeNode<? extends MyClass> NodeClass;

+1

說實話,如果'T'不匹配樹中的節點,我就沒有看到使用泛型的要點。鑑於此,'element'應該只是'MyClass'。 – 2013-03-01 13:24:43

+0

啊,當然,只是讓他們成爲所有的基本類型! – Lerp 2013-03-01 13:26:35

+2

正如一個旁註:我會用'List <...>'替換'ArrayList <...>'。 – Thomas 2013-03-01 13:27:11

回答

4

由於我的意見對你很有幫助,我會後它作爲一個答案:

我看不出使用泛型的點,如果T不會在一棵樹上節點之間的匹配。鑑於此,element應該只是MyClass

+2

這是我見過的最快的upvote--你是怎麼做到的? – 2013-03-01 13:31:38

+2

我在網頁上說「1新答案」,所以我加載和upvoted:P – Lerp 2013-03-01 13:33:02

+1

哈,從我的POV它從字面上開始,1票。祝願我所有的答案都做到了:) – 2013-03-01 13:39:40

1

FWIW,重複所述綁定類型參數(T extends MyClass)作爲結合的通配符(? extends MyClass)的,也絕對沒有什麼。只需使用無界通配符?(如TreeNode<?>)。

+0

這不是爲了讓別人閱讀代碼意識到它只能包含擴展MyClass的節點嗎?我不是在質疑你,我只是好奇這是否是一個合理的理由? – Lerp 2013-03-01 13:32:07

+2

@Lerp如果用戶知道類「TreeNode」,她也知道不能存在任何參數不會擴展MyClass的實例(除了使用原始類型時)。 – Thomas 2013-03-01 13:40:56

2

如果你想保持仿製藥,你可以縮短

ArrayList<TreeNode<? extends MyClass>> children; 

List<TreeNode<?>> children; 

因爲extends MyClass在類定義,編譯器仍然可以推斷,只有樹節點與規定允許延伸MyClass(或MyClass本身)的參數。

請記住,訪問元素時仍需要使用MyClass,因爲這是唯一已知的常見超類。