Java Generics - Class or Class<? 扩展了 SomeClass>



我正在编写一个程序,该程序将使用Java反射(即Class.forName())根据用户的输入动态创建类实例。一个要求是,我的程序创建的实例必须扩展我定义的一个特定的类,称为SomeClass。我的问题是:为了存储这个类类型,我应该使用有界泛型Class<? extends SomeClass>,还是简单地使用无界泛型Class ?我发现一些Java书籍说Class是使用无界通配符泛型的良好实践之一,但我想知道这是否适用于我的程序中的情况。

如果您觉得我的问题不够清楚或需要了解一些信息,请随时告诉我。

你应该使用Class<? extends SomeClass>,因为这就是泛型的作用。

在调用Class.forName时,检查它是否SomeClass.class.isAssignableFrom这个新类。否则,应该抛出IllegalArgumentExceptionClassCastException

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();
}

相关内容

  • 没有找到相关文章

最新更新