Class.forName returns 怎么可能 Class<?扩展 MyAbstractClass>?

how can a Class.forName returns a Class<? extends MyAbstractClass>?

假设我有一个摘要 class MyAbstractClass:

public abstract class MyAbstractClass {
   public abstract SomeObject doSomething();
}

我有一些具体的实现 class、MyConcreteClass1MyConcreteClass2

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

String concreteImplementationName = getConcreteImplementationName();
Class<?> klass = Class.forName(concreteImplementationName);

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

现在,在这种情况下,我知道 concreteImplementationName 将只包含 MyAbstractClass 的实现之一的名称。如何将 klass 转换为 Class<? extends MyAbstractClass>

Class<? extends MyAbstractClass> x = // what do I need to do here?

您可以使用 Class.asSubclass 来做到这一点。它的工作方式类似于演员表,但适用于 Class 对象。

c.asSubclass(T.class) 将检查 c 实际上是 T 的子类,如果是,它将 return Class<? extends T>。否则它会抛出一个 ClassCastException.

所以你想要这个:

Class<? extends MyAbstractClass> x = klass.asSubclass(MyAbstractClass.class);

加个演员就行了。您可以安全地执行此操作,因为您知道它是 MyAbstractClass

的子类型
public class Example {
    public static void main(String[] args) throws Exception {
        String concreteImplementationName = "com.example.Implementation";
        Class<? extends MyAbstractClass> x = (Class<? extends MyAbstractClass>) Class.forName(concreteImplementationName); // what do i need to do
    }
}

class Implementation extends MyAbstractClass {
}

class MyAbstractClass {
}