Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Generics_Inheritance_Tree - Fatal编程技术网

继承自引用类的Java类

继承自引用类的Java类,java,oop,generics,inheritance,tree,Java,Oop,Generics,Inheritance,Tree,我试图在java类中实现一个简单的树。但是,我需要另一个类来扩展这个树类 我让树递归如下: class Tree<T> { public T data; public List<Tree<T>> children; public Tree(T data){ this.data = data; } } class WeightedTree<T> extends Tree<T> clas

我试图在java类中实现一个简单的树。但是,我需要另一个类来扩展这个树类

我让树递归如下:

class Tree<T> {
    public T data;
    public List<Tree<T>> children;

    public Tree(T data){
        this.data = data;
    }
}
class WeightedTree<T> extends Tree<T>
class Tree<T, SELF extends Tree<T, SELF>> {
    public T data;
    public List<SELF> children;
}

class WeightedTree<T> extends Tree<T, WeightedTree<T>> {}
类树{
公共数据;
公开儿童名单;
公共树(T数据){
这个数据=数据;
}
}
但是,假设我做了这样一个类:

class Tree<T> {
    public T data;
    public List<Tree<T>> children;

    public Tree(T data){
        this.data = data;
    }
}
class WeightedTree<T> extends Tree<T>
class Tree<T, SELF extends Tree<T, SELF>> {
    public T data;
    public List<SELF> children;
}

class WeightedTree<T> extends Tree<T, WeightedTree<T>> {}
类权重树扩展了树

它的孩子都是普通的树,不是加权树。有没有一种方法可以通过OOP原则来实现这一点

您可以这样做:

class Tree<T> {
    public T data;
    public List<Tree<T>> children;

    public Tree(T data){
        this.data = data;
    }
}
class WeightedTree<T> extends Tree<T>
class Tree<T, SELF extends Tree<T, SELF>> {
    public T data;
    public List<SELF> children;
}

class WeightedTree<T> extends Tree<T, WeightedTree<T>> {}

或者,您可以为
Tree
WeightedTree
创建一个具有自类型和独立子类的抽象基类。您可以执行以下操作:

class Tree<T> {
    public T data;
    public List<Tree<T>> children;

    public Tree(T data){
        this.data = data;
    }
}
class WeightedTree<T> extends Tree<T>
class Tree<T, SELF extends Tree<T, SELF>> {
    public T data;
    public List<SELF> children;
}

class WeightedTree<T> extends Tree<T, WeightedTree<T>> {}
/* Package */ abstract class TreeBase<T, TREE_T extends TreeBase<T, TREE_T>> {
    public T data;
    public List<TREE_T> children;

    public TreeBase(T data) {
        this.data = data;
    }
}

public class Tree<T> extends TreeBase<T, Tree<T>> {
    public Tree(T data) {
        super(data);
    }
}

public class WeightedTree<T> extends TreeBase<T, WeightedTree<T>> {
    public WeightedTree(T data) {
        super(data);
    }
}
或者您可以为
Tree
WeightedTree

/*Package*/abstract class树基创建一个具有自类型和独立子类的抽象基类{
/* Package */ abstract class TreeBase<T, TREE_T extends TreeBase<T, TREE_T>> {
    public T data;
    public List<TREE_T> children;

    public TreeBase(T data) {
        this.data = data;
    }
}

public class Tree<T> extends TreeBase<T, Tree<T>> {
    public Tree(T data) {
        super(data);
    }
}

public class WeightedTree<T> extends TreeBase<T, WeightedTree<T>> {
    public WeightedTree(T data) {
        super(data);
    }
}
公共数据; 公开儿童名单; 公共树基(T数据){ 这个数据=数据; } } 公共类树扩展树基{ 公共树(T数据){ 超级(数据); } } 公共类加权树扩展树基{ 公共加权树(T数据){ 超级(数据); } }
/*包*/抽象类树状结构{
公共数据;
公开儿童名单;
公共树基(T数据){
这个数据=数据;
}
}
公共类树扩展树基{
公共树(T数据){
超级(数据);
}
}
公共类加权树扩展树基{
公共加权树(T数据){
超级(数据);
}
}

你的通配符示例不起作用:你不能实例化这样的类型。@ruakh你可以,如果是推断的话。我的话,你是对的!真奇怪。谢谢您的更正。:-)你的通配符示例不起作用:你不能实例化这样一个类型。@ruakh但是你可以,如果它是推断出来的。我的话,你是对的!真奇怪。谢谢您的更正。:-)