我知道我可以做到以下几点:
String className = "A";
Object o= Class.forName(className).newInstance();
但请考虑这种情况(简化):
class Parent {
public void action() {...};
}
class A extends Parent {
@Override
public void action() {...};
}
class B extends Parent {
@Override
public void action() {...};
}
class C extends Parent {
@Override
public void action() {...};
}
现在我想创建一个可以是这三种情况之一的类。
如果我使用上面的代码并创建一个Object,我将无法调用action
方法。
我希望能够创建一个从字符串扩展Parent的对象。
在我的实际案例中,我有多个不同的父母,而且这个班级是从一个班级扩展而来的,这个班级从一个班级扩展到大约4层不等。常规铸造会起作用吗?
答案 0 :(得分:2)
施法会起作用,但是没必要。 Class#newInstance()
返回类型T
的实例,它是类的泛型类型。这意味着,因为Class.forName("A")
会返回Class<A>
的实例,所以由于Parent
的继承,您可以将实例声明为A
,因为newInstance()
正在返回A
类型的对象。
Parent p = Class.forName("A").newInstance();
p.action();
答案 1 :(得分:0)
由于您的所有类都扩展Parent
,您可以将newInstance()
的结果转换为此类型,然后调用Parent
中声明的所有方法。 “正确”的实施将运行。
Parent p = (Parent)Class.forName(className).newInstance();
p.action();