Class.forName如何返回一个Class <! - ?扩展MyAbstractClass - >?

时间:2015-03-18 04:19:20

标签: java generics

我们说我有一个抽象类MyAbstractClass

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

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

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

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?

2 个答案:

答案 0 :(得分:4)

您可以使用Class.asSubclass执行此操作。它类似于强制转换,但对于Class对象。

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

所以你想要这个:

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

答案 1 :(得分:1)

只需添加演员。您可以安全地执行此操作,因为您知道它是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 {
}
相关问题