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

时间:2014-10-23 09:15:46

标签: java class parent-child

我搜索了很多,但似乎我不知道一个描述这种情况的术语,因为我在编程方面相当新。 我有一个absctract类。像这样:

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

我有很多子课程,比如class B extends A, class C extends A。 然后我有单独的类,它应该知道子类的类型。像这样:

public class D {

private Class<? extends A> childClassType; 

public C(Class<? extends A> type) { ... }
....
}

事情是:这个类应该有一个方法,它应该返回子类的对象(在这里作为参数传递)。这样我就可以为他的类型转换一些值并调用randomize()方法。

基本上,我在C类中需要这样的东西:

public [???] neededMethod() {
libraryMethodRequiringClassAsParameter(childClassType);
....
[???] childObject = ([???]) libraryMethodReturningObject();
childObject.randomize();
return childObject;
}

我不知道[???]的语法,因为我不知道这种情况是怎么调用的。我可以创建一个对象(它可以工作),但是我需要双重投射(从对象到A,在A之外到它的孩子),这看起来很愚蠢。

对任何信息都会感激不尽。

4 个答案:

答案 0 :(得分:0)

我不知道我是否理解正确,但您可能正在寻找的术语是generic classHere是关于它的一些文档,应用于您可能具有类似内容的代码

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

答案 1 :(得分:0)

包含该类型的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;
    }
}

答案 2 :(得分:0)

我可以使用以下代码。希望它符合您的要求:

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");
    }
}

答案 3 :(得分:0)

如何将Object用作数据类型?在Java中,Object是所有类的超类。

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