具有相同基类的泛型

时间:2013-03-01 13:20:57

标签: java generics

我有一个像这样定义的TreeNode类:

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

我想知道是否有更简单的方法将所有TreeNode限制为扩展MyClass的泛型类型变量?写出ArrayList<TreeNode<? extends MyClass>>非常乏味。我不能只做ArrayList<TreeNode<T>>,因为树不能包含具有不同MyClass继承的节点。

我试着这样做: public static const Class NODE_CLASS = TreeNode<? extends TreeNode>.class;但我认为您不能将泛型用作类对象的一部分。

Someting与C ++ typedef的同义词,我想,I.e。 typedef TreeNode<? extends MyClass> NodeClass;

3 个答案:

答案 0 :(得分:4)

由于我的评论似乎对您有帮助,我会将其作为答案发布:

如果T在树中的节点之间不匹配,我没有看到使用泛型的意义。鉴于此,element应为MyClass

答案 1 :(得分:2)

如果你想保留泛型,你可以缩短

ArrayList<TreeNode<? extends MyClass>> children;

List<TreeNode<?>> children;

因为类定义中声明了extends MyClass,所以编译器仍然能够推断出只允许具有扩展MyClass(或MyClass本身)参数的树节点。< / p>

请记住,在访问元素时,您仍然必须使用MyClass,因为这是唯一已知的常见超类。

答案 2 :(得分:1)

FWIW,重复类型参数(T extends MyClass)的边界作为通配符(? extends MyClass)的边界,什么都不做。只需使用无界通配符?(如TreeNode<?>中所示)。