Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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 将self类传递给父泛型_Java_Generics - Fatal编程技术网

Java 将self类传递给父泛型

Java 将self类传递给父泛型,java,generics,Java,Generics,我有一个父类,它需要为某个方法存储对实例化子类的引用。为此,我在父类的构造函数中强制一个泛型 public abstract class Parent<T> { Class<T> clazz; public Parent(Class<T> clazz) { this.clazz = clazz; } } 公共抽象类父类{ 课堂讨论; 公共家长(班级){ this.clazz=clazz; } } 在子类中,我使用相

我有一个父类,它需要为某个方法存储对实例化子类的引用。为此,我在父类的构造函数中强制一个泛型

public abstract class Parent<T> {
    Class<T> clazz;

    public Parent(Class<T> clazz) {
        this.clazz = clazz;
    }
}
公共抽象类父类{
课堂讨论;
公共家长(班级){
this.clazz=clazz;
}
}
在子类中,我使用相同的子类型扩展父类

public class Child extends Parent<Child> {
    public Child() {
        super(Child.class);
    }
}
公共类子级扩展父级{
公共儿童(){
超级(儿童班);
}
}

这对其他人来说是不是很奇怪?我觉得子类是多余的,因为我在泛型和构造函数中重用了相同的类型,这与调用类的类型相同。

虽然这看起来很奇怪,但不会产生预期的效果,因为在创建子类时,您没有要求父类,您只是在扩展父对象

要解决这个问题,应该将父类作为子类的参数

像这样的东西

public class Parent{
//Put something here to keep track of the children
//You could use a HashMap, or an ArrayList
private ArrayList<Child> children = new ArrayList<Child>();
     public void registerChild(Child child){
           children.add(child);   
     }
}

public class Child {
    public Child(Parent parent) {
        parent.registerChild(this);
    }
}
公共类父类{
//在这里放点东西跟踪孩子们
//您可以使用HashMap或ArrayList
private ArrayList children=new ArrayList();
公共无效注册表子项(子项){
添加(child);
}
}
公营儿童{
公共子(父/母){
父母注册子女(本);
}
}

No这很好,此模式通常与泛型一起使用。当然,真正的问题是为什么你需要这样的课程。可能是分层违规。你似乎对OP的意图做了很多假设。公平,尽管给出的代码会满足OP的要求,正如我所说的,就我所知(承认不是很大),OP代码不会回调调用它的家长。它将为正在扩展的父对象创建一个新对象。因此,子类不能向父类注册自身。