我正在编写一个程序,它将使用Java反射(即Class.forName()
)根据用户的输入动态创建类实例。一个要求是我的程序创建的实例必须扩展一个特定的I类定义,称为SomeClass
。我的问题是:对于存储此类类型,我应该使用有界泛型,Class<? extends SomeClass>
还是简单的无界泛型Class
?我发现一些Java书籍说Class是使用无界通配符泛型的好方法之一,但我想知道这是否适用于我程序中的情况。
如果您发现我的问题不够明确或需要一些信息,请随时告诉我。
答案 0 :(得分:16)
您应该使用Class<? extends SomeClass>
,因为这是泛型的用途。
在您调用Class.forName
时,请检查SomeClass.class.isAssignableFrom
是否为新班级。否则,您应该抛出IllegalArgumentException
或ClassCastException
。
编辑或者,拨打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();
}