Class.forName 如何返回 Class<?扩展 MyAbstractClass>?

SK1*_*76H 5 java generics

假设我有一个抽象类MyAbstractClass

public abstract class MyAbstractClass {
   public abstract SomeObject doSomething();
}
Run Code Online (Sandbox Code Playgroud)

我有这个类的一些具体实现,MyConcreteClass1MyConcreteClass2.

假设我从文件中读取了任何具体实现的类名,然后我想创建对象:

String concreteImplementationName = getConcreteImplementationName();
Class<?> klass = Class.forName(concreteImplementationName);
Run Code Online (Sandbox Code Playgroud)

我得到了类,然后使用反射我可以实例化一个对象。

现在,在这种情况下,我知道concreteImplementationName将只包含MyAbstractClass. 我怎样才能转换klassClass<? extends MyAbstractClass>?

Class<? extends MyAbstractClass> x = // what do I need to do here?
Run Code Online (Sandbox Code Playgroud)

use*_*751 5

您可以使用它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)