Java 泛型 - Class 或 Class<?扩展某些类>

标签 java class generics reflection

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

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

最佳答案

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

在您调用 Class.forName 时, 检查它是否 SomeClass.class.isAssignableFrom新类(class)。否则,你应该抛出 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();
}

关于Java 泛型 - Class 或 Class<?扩展某些类>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16969952/

相关文章:

java - Wicket 口更改标签/文本字段值

java - 如何从源代码生成 API 版本?

c++ - 如何打破 GDB 中类的每个方法?

Java 类型转换问题

c# - 如何找到列表之间的差异?

java - 单击按钮时如何显示颜色选择器?

java - 需要一个 SMTP 测试服务器进行集成测试(selenium)

jQuery:选择器(带空格的类名)

c++ - 基类和派生类私有(private)成员变量使用

c# - 为什么这个通用转换失败