我正在编写一个程序,它将使用 Java 反射(即 Class.forName()
)根据用户的输入动态创建类实例。一个要求是我的程序创建的实例必须扩展我定义的一个特定类,称为 SomeClass
.我的问题是:为了存储此类类型,我应该使用有界泛型 Class<? extends SomeClass>
,或简单地无限泛型,Class
?我发现一些Java书籍说Class是使用无界通配符泛型的良好实践之一,但我想知道这是否适用于我程序中的情况。
如果您发现我的问题不够清楚或需要一些信息,请随时告诉我。
最佳答案
你应该使用 Class<? extends SomeClass>
因为这就是泛型的用途。
在您调用 Class.forName
时, 检查它是否 SomeClass.class.isAssignableFrom
新类(class)。否则,你应该抛出 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();
}
关于Java 泛型 - Class 或 Class<?扩展某些类>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16969952/