我们说我有一个抽象类MyAbstractClass
:
public abstract class MyAbstractClass {
public abstract SomeObject doSomething();
}
我有这个类的一些具体实现,MyConcreteClass1
和MyConcreteClass2
。
让我说我从文件中读取任何具体实现的类名,然后我想创建对象:
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?
答案 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 {
}