[英]Java: How to return object of not known child class from another class (not parent)?
我在Google上搜索了很多,但是似乎我不知道描述这种情况的术语,因为我在编程方面还很陌生。 我有一门抽象课。 像这样:
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到它的孩子的外部),这似乎很愚蠢。
任何信息将不胜感激。
我不知道我是否正确地理解了您,但是您可能要寻找的术语是generic class
。 这是一些文档,将其应用于您的代码后,您可能会遇到这样的情况
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");
}
}
使用Object
作为数据类型怎么样? 在Java中, Object
是所有类的超类。
public Object neededMethod() {
libraryMethodRequiringClassAsParameter(childClassType);
....
Object childObject = libraryMethodReturningObject();
if(childObject instanceof ClassFoo) {
((ClassFoo)childObject).randomize();
}
return childObject;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.