我正在编写一个程序,它将使用
Java反射(即Class.forName())根据用户的输入动态创建类实例.一个要求是我的程序创建的实例必须扩展一个我定义的一个类,称为SomeClass.我的问题是:对于存储这个类类型,我应该使用有界泛型,Class扩展SomeClass>还是简单的无界通用类?我发现一些Java书籍说,Class是使用无界通配符的好习惯之一,但我想知道这是否适用于我的程序中的情况.
如果您发现我的问题不够清楚或需要某些信息,请随时通知我.
解决方法
你应该使用Class扩展SomeClass>因为这是泛型的.
当你调用Class.forName时,检查一下SomeClass.class.isAssignable来自新的类.否则,你应该抛出一个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(); }