我正在编写一个程序,该程序将使用Java反射(即Class.forName()
)根据用户的输入动态创建类实例。一个要求是,我的程序创建的实例必须扩展我定义的一个特定的类,称为SomeClass
。我的问题是:为了存储这个类类型,我应该使用有界泛型Class<? extends SomeClass>
,还是简单地使用无界泛型Class
?我发现一些Java书籍说Class是使用无界通配符泛型的良好实践之一,但我想知道这是否适用于我的程序中的情况。
如果您觉得我的问题不够清楚或需要了解一些信息,请随时告诉我。
你应该使用Class<? extends SomeClass>
,因为这就是泛型的作用。
在调用Class.forName
时,检查它是否SomeClass.class.isAssignableFrom
这个新类。否则,应该抛出IllegalArgumentException
或ClassCastException
。
EDIT:或者,调用asSubclass(SomeClass.class)
将为您完成此操作。
public SomeClass instantiate(String name)
throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> raw = Class.forName(name);
//throws ClassCastException if wrong
Class<? extends SomeClass> generic = raw.asSubclass(SomeClass.class);
// do what you want with `generic`
return generic.newInstance();
}