2

我有一个 TreeNode 类定义如下:

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

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

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

我猜想是 C++ 的同义词typedef,即 typedef TreeNode<? extends MyClass> NodeClass;

4

3 回答 3

4

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

T如果树中的节点之间不匹配,我看不到使用泛型的意义。鉴于此,element应该只是MyClass.

于 2013-03-01T13:30:42.383 回答
2

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

ArrayList<TreeNode<? extends MyClass>> children;

List<TreeNode<?>> children;

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

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

于 2013-03-01T13:31:10.847 回答
1

FWIW 将类型参数 ( T extends MyClass) 的边界重复为通配符 ( ? extends MyClass) 的边界,完全没有任何作用。只需使用无界通配符?(如TreeNode<?>)。

于 2013-03-01T13:30:18.197 回答