Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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_Class_Parent Child - Fatal编程技术网

Java:如何从另一个类(非父类)返回未知子类的对象?

Java:如何从另一个类(非父类)返回未知子类的对象?,java,class,parent-child,Java,Class,Parent Child,我在谷歌上搜索了很多,但似乎我不知道用什么术语来描述这种情况,因为我对编程相当陌生。 我上了一堂缺席课。大概是这样的: public abstract A { ... public void randomize() {...} ... } public class D { private Class<? extends A> childClassType; public C(Class<? extends A> type) { ... } .... } 我

我在谷歌上搜索了很多,但似乎我不知道用什么术语来描述这种情况,因为我对编程相当陌生。 我上了一堂缺席课。大概是这样的:

public abstract A { 
...
public void randomize() {...} 
... 
}
public class D {

private Class<? extends A> childClassType; 

public C(Class<? extends A> type) { ... }
....
}
我有很多子类,比如B类扩展了a类,C类扩展了a类。 然后我有一个单独的类,它应该知道子类的类型。大概是这样的:

public abstract A { 
...
public void randomize() {...} 
... 
}
public class D {

private Class<? extends A> childClassType; 

public C(Class<? extends A> type) { ... }
....
}
我不知道[??]的语法,因为我不知道这种情况是如何调用的。我可以创建一个可以工作的对象,但是我需要从对象到A的内部,从A到它的子对象的外部,这看起来很愚蠢


如有任何信息,将不胜感激

我不知道我是否理解正确,但您可能要查找的术语是泛型类。是关于它的一些文档,应用到你的代码中,你可以有这样的东西

public class D<T> {
    ...
    public T neededMethod() {...}
}

包含该类型的类D对于它所使用的类型应该是泛型的

public class D<T extends A> {

    private Class<T> childClassType; 

    public D(Class<T> type) { ... }
        ....
    }

    public T neededMethod() {
           T childObject = (T)libraryMethodRequiringClassAsParameter(childClassType);
           childObject.randomize();
           return childObject;
    }
}

我可以让下面的代码工作。希望它符合您的要求:

public class A {
    ... 
    public static void doStuff(Class<? extends B> clazz) {
        try {
            C obj = clazz.newInstance();
            obj.randomize();
        } catch (InstantiationException | IllegalAccessException e) {
        }       
    }

}

abstract class B {
    abstract void randomize();
}

class C extends B {
    ...
    public void randomize() {
        System.out.println("works");
    }
}
使用对象作为数据类型怎么样?在Java中,Object是所有类的超类

public Object neededMethod() {
    libraryMethodRequiringClassAsParameter(childClassType);
    ....
    Object childObject = libraryMethodReturningObject();
    if(childObject instanceof ClassFoo) {
        ((ClassFoo)childObject).randomize();
    }
    return childObject;
}

为什么不能将子对象作为参数传递?一个类的所有子类都可以使用randomize方法。理想情况下,在调用这个类之前,它不应该存在。即使我在其他地方创建了它,如何定义neededMethod应该作为子类的参数对象,而这个子类不知道a?我查看了它的文档,但问题是:T不应该是任意的,它应该是a的子类。而且,我需要知道在方法内部,它是什么。我无法将T或T.class传递给需要ClassA参数的LibraryMethod。