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

时间:2013-06-06 18:53:09

标签: java class generics reflection

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

如果您发现我的问题不够明确或需要一些信息,请随时告诉我。

1 个答案:

答案 0 :(得分: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();
}