从类型到类的 Java 泛型

标签 java reflection java-7

我编写了一个通用类来帮助我们更轻松地编写单元测试。它基本上允许我们使用相同的方法来设置我们的测试,并有一些常用的方法来测试。我知道泛型类的意义在于不关心我们使用的是什么类,但是拥有这些信息是有帮助的(具体的实现可以有一个正确类型的实例变量)。

这是我的类(class):

public abstract class AbstractModuleTest<M extends Module> {
  @Autowired protected WebDriver driver;
  private final Type type;

protected AbstractModuleTest() {
  final ParameterizedType parameterizedType = 
      (ParameterizedType) getClass().getGenericSuperclass();
  type = parameterizedType.getActualTypeArguments()[0];
}

protected <S extends AbstractPage> M setup(final S s, final String errorMsg) {
  for (final Module m : s.getModules()) {
    if (m.getClass().equals(type)) {
      try {
        final Class c = Class.forName(StringUtils.subStringAfter(type.toString(), " "));
        return (M) c.cast(m);
      } catch (ClassNotFoundException cnfe) { throw new RuntimeException(cnfe); }
    }
  }
  Assert.fail(errorMsg);
}

是否有更简单的方法来获取我正在处理的类(以避免 StringUtils.substringAfter 调用)?

最佳答案

在那个方法中你不需要Class。当 m.getClass().equals(type)) 返回 true 时,进行未经检查的转换是安全的(如果 M,可能会有一些极端情况> 是通用的,但您的代码也没有捕捉到它们):

protected <S extends AbstractPage> M setup(final S s, final String errorMsg) {
    for (final Module m : s.getModules()) {
        if (m.getClass().equals(type)) {
            @SuppressWarnings("unchecked")
            M result = (M) m;
            return result;
        }
    }
    Assert.fail(errorMsg); 
}

关于从类型到类的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10338032/

相关文章:

java - "==0"与 "<1"的偏好

java - Java 媒体组件发生了什么变化?

java - 使用泛型来增加集合

reflection - 如何使用反射检查接口(interface)是否指定方法

c# - 使用 System.Type 中的泛型类型调用泛型方法

java - 安装 JDK 和使用转储之间的区别

java.lang.UnsupportedOperationException : 'posix:permissions' not supported as initial attribute on Windows

java - Android - 不推荐使用 getRunningservices(ActivityManager)

java - JPA:如何保持多对多关系

java - 迭代openCV java中的视频帧