2013-03-01 106 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,因为这是唯一已知的常见超类。