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、MyConcreteClass1
和 MyConcreteClass2
。
假设我从文件中读取了任何具体实现的 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 {
}
假设我有一个摘要 class MyAbstractClass
:
public abstract class MyAbstractClass {
public abstract SomeObject doSomething();
}
我有一些具体的实现 class、MyConcreteClass1
和 MyConcreteClass2
。
假设我从文件中读取了任何具体实现的 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 {
}