Java泛型从类型到类

Java泛型从类型到类,java,reflection,java-7,Java,Reflection,Java 7,我已经编写了一个泛型类来帮助我们更容易地编写单元测试。它基本上允许我们使用相同的方法来设置测试,并且有一些常用的方法来测试。我知道泛型类的要点是不关心我们使用的是什么类,但是拥有这些信息是有帮助的(具体的实现可以有一个适当类型的实例变量) 这是我的班级: public abstract class AbstractModuleTest<M extends Module> { @Autowired protected WebDriver driver; private fina

我已经编写了一个泛型类来帮助我们更容易地编写单元测试。它基本上允许我们使用相同的方法来设置测试,并且有一些常用的方法来测试。我知道泛型类的要点是不关心我们使用的是什么类,但是拥有这些信息是有帮助的(具体的实现可以有一个适当类型的实例变量)

这是我的班级:

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);
}
公共抽象类AbstractModuleTest{
@自动连线保护的网络驱动程序;
私有最终类型;
受保护的AbstractModuleTest(){
最终参数化类型参数化类型=
(ParameterizedType)getClass().getGenericSuperclass();
类型=ParameteredType.getActualTypeArguments()[0];
}
受保护的M设置(最终S、最终字符串错误消息){
对于(最终模块m:s.getModules()){
if(m.getClass().equals(type)){
试一试{
最后一个类c=Class.forName(StringUtils.subStringAfter(type.toString(),“”));
返回(M)c.cast(M);
}catch(ClassNotFoundException cnfe){抛出新的运行时异常(cnfe);}
}
}
Assert.fail(errorMsg);
}

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

在该方法中不需要
Class
。当
m.getClass().equals(type))
返回
true
时,可以安全地执行未经检查的强制转换(如果
M
是泛型的,可能会出现一些特殊情况,但您的代码也无法捕捉到它们):

受保护的M设置(最终S、最终字符串错误消息){
对于(最终模块m:s.getModules()){
if(m.getClass().equals(type)){
@抑制警告(“未选中”)
M结果=(M)M;
返回结果;
}
}
Assert.fail(errorMsg);
}

在该方法中不需要
Class
。当
m.getClass().equals(type))
返回
true
时,可以安全地执行未选中强制转换(如果
m
是泛型的,可能会出现一些特殊情况,但您的代码也无法捕捉到它们):

受保护的M设置(最终S、最终字符串错误消息){
对于(最终模块m:s.getModules()){
if(m.getClass().equals(type)){
@抑制警告(“未选中”)
M结果=(M)M;
返回结果;
}
}
Assert.fail(errorMsg);
}

类名不能包含空格,然后可以使用split方法避免使用StringUtils

type.toString().split(" ")[1];

类名不能包含空格,然后可以使用split方法避免使用StringUtils

type.toString().split(" ")[1];