假设我有一个抽象类MyAbstractClass:
public abstract class MyAbstractClass {
public abstract SomeObject doSomething();
}
Run Code Online (Sandbox Code Playgroud)
我有这个类的一些具体实现,MyConcreteClass1和MyConcreteClass2.
假设我从文件中读取了任何具体实现的类名,然后我想创建对象:
String concreteImplementationName = getConcreteImplementationName();
Class<?> klass = Class.forName(concreteImplementationName);
Run Code Online (Sandbox Code Playgroud)
我得到了类,然后使用反射我可以实例化一个对象。
现在,在这种情况下,我知道concreteImplementationName将只包含MyAbstractClass. 我怎样才能转换klass为Class<? extends MyAbstractClass>?
Class<? extends MyAbstractClass> x = // what do I need to do here?
Run Code Online (Sandbox Code Playgroud)
您可以使用它Class.asSubclass来执行此操作。它的工作方式类似于强制转换,但适用于 Class 对象。
c.asSubclass(T.class)将检查c是真正的一个子类T,如果是的话它会返回一个Class<? extends T>。否则它会抛出一个 ClassCastException。
所以你想要这个:
Class<? extends MyAbstractClass> x = klass.asSubclass(MyAbstractClass.class);
Run Code Online (Sandbox Code Playgroud)