在java中实例化自绑定泛型
可能是一个简单的问题,但出于某种原因,我似乎不能这样做。如何从下面的类实例化BinaryTree类型的对象:在java中实例化自绑定泛型,java,generics,Java,Generics,可能是一个简单的问题,但出于某种原因,我似乎不能这样做。如何从下面的类实例化BinaryTree类型的对象: public class BinaryTree<N extends BinaryTree.BTNode<N>> { public static class BTNode<N extends BTNode<N>> { public N left; public N right; public N parent;
public class BinaryTree<N extends BinaryTree.BTNode<N>> {
public static class BTNode<N extends BTNode<N>> {
public N left;
public N right;
public N parent;
}
//some methods which return variables of type N
//or take variables of type N as arguments
}
公共类二进制树{
公共静态类BTNode{
公共N左;
公共权利;
公母;
}
//返回N类型变量的一些方法
//或者将N类型的变量作为参数
}
两者:
BinaryTree=newbinarytree();
以及:
BinaryTree=newbinarytree();
在Eclipse中生成一个编译器错误,表示BTNode类型不是有界参数N extends BTNode的有效替代品
这种结构的原因是,我希望能够扩展BinaryTree和BTNode,并使子类调用超类函数,这些函数返回N类型的变量,并且使N属于BTNode子类的类型,而不是BTNode类型
我觉得我可能错过了一些明显的东西,但我已经进行了广泛的搜索,花了相当多的时间尝试不同的东西,我仍然无法做到这一点
非常感谢您的帮助。这并不能完全解决您的问题,但我认为您的问题是由次优设计造成的。保持你的类型简单!对于二叉树,我希望type参数是树中数据的类型,即节点标签的类型。因为您也可以使用类型变量作为类型参数,所以这正是您想要的
public class BinaryTree<E> {
public static class BTNode<T> {
public T label;
public BTNode<T> left;
public BTNode<T> right;
public BTNode<T> parent;
}
//some methods which return variables of type BTNode<E>.
//or take variables of type BTNode<E> as arguments
}
公共类二进制树{
公共静态类BTNode{
公共T标签;
公共BTNode左;
公共节点权;
公共节点父节点;
}
//返回BTNode类型变量的某些方法。
//或者将BTNode类型的变量作为参数
}
我最终找到了我想要做的事情,我想为了子孙后代,我会把它贴出来
基本上,我有
Class Node<N extends Node<N, E>, E> {
N left, right, parent;
E element;
无论如何,我不确定是否有人关心,但我想我还是会发布解决方案。我认为对于这个中间类,您不能给出比以下更好的泛型参数:
BinaryTree>tree=new BinaryTree()代码>对于更具体的实现,这将如您所期望的那样工作。但后来我尝试扩展BTNode以增加字段,并扩展BinaryTree以使用扩展节点类型。例如,我有XBinaryTree扩展BinaryTree和XBTNode扩展BTNode。当从XBinaryTree调用继承的函数时,我会得到BTNode的返回类型,当我需要XBTNode的返回类型时。子类中方法的返回类型可以是超类中重写方法的返回类型的子类型。但这只是返回类型的情况,而不是参数。您想添加什么类型的额外字段?如果它们是附加数据,我会扩展数据类,然后使用BinaryTree
,而不是修改BinaryTree
类。因此,所有类的结构都与我的原始问题相同,所有类都能正确编译,返回类型都正确(至少编译器认为正确),但我无法测试它,因为我无法实际实例化“BinaryTree”或“XBinaryTree”类型的对象,这是一个扩展类,其中节点将元素附加到它们,并在键入注释的同时键入注释。无论如何,谢谢你的持续帮助。我会再写一点,看看有什么效果。
public class BinaryTree<E> {
public static class BTNode<T> {
public T label;
public BTNode<T> left;
public BTNode<T> right;
public BTNode<T> parent;
}
//some methods which return variables of type BTNode<E>.
//or take variables of type BTNode<E> as arguments
}
Class Node<N extends Node<N, E>, E> {
N left, right, parent;
E element;
Class Tree<N extends Node<N, E>, E> {
N rootNode;
N externalNode;
public N findNode(E e) //returns the node with element e
public boolean add(E e) //adds a new node of type N with
// element e to the tree
//etc
Class XNode<N extends XNode<N, E>, E> extends Node<N, E> {
Class XTree<N extends XNode<N, E>, E> extends Tree<N, E> {
Class SampleNode<E> extends Node<SampleNode<E>, E>
SampleNode<ElementType> sample = new SampleNode<ElementType>();
Tree<SampleNode<ElementType>, ElementType> tree
= new Tree<SampleNode<ElementType>, ElementType>(sample);
public N newNode() {
return (N)(sample.getClass().newInstance()) //needs try-catch and
// suppress unchecked