Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中实例化自绑定泛型_Java_Generics - Fatal编程技术网

在java中实例化自绑定泛型

在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;

可能是一个简单的问题,但出于某种原因,我似乎不能这样做。如何从下面的类实例化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;    
}
//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