10

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

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

4

1 回答 1

17

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

在调用时Class.forName,检查它是否SomeClass.class.isAssignableFrom是新类。否则,你应该抛出一个IllegalArgumentExceptionor 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();
}
于 2013-06-06T18:55:12.937 回答