Java泛型 - 类或类<?扩展SomeClass>

kee*_*lar 10 java generics reflection class

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

如果您发现我的问题不够清楚或者需要一些信息,请随时告诉我.

wch*_*gin 16

你应该使用,Class<? extends SomeClass>因为这是泛型的用途.

在您调用时Class.forName,检查它是否SomeClass.class.isAssignableFrom是新类.否则,你应该扔一个IllegalArgumentExceptionClassCastException.

编辑:或者,呼叫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();
}
Run Code Online (Sandbox Code Playgroud)

  • 使用[`asSubclass`](http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#asSubclass \(java.lang.Class \))会更干净而不是检查`isAssignableFrom`然后自己抛出异常. (3认同)
  • 举个类比,只是因为一个方法可以抛出未经检查的`NullPointerException`并不意味着*任何使用该方法的方法*必须声明它也被抛出.如果是这种情况,几乎所有方法都会抛出NullPointerException,IllegalArgumentException. (3认同)