我有一个像这样定义的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;
答案 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<?>
中所示)。