2014-10-21 98 views
4

我想编写一个通用的方法(与仿制药或PARAM)如何用泛型类型写一个java方法?

,将取代这两个调用:

private ServerEvent filterEvents() { 
    return argThat(new ArgumentMatcher<ServerEvent>() { 
     @Override 
     public boolean matches(Object argument) { 
      return argument instanceof Type1; 
     } 
    }); 

private ServerEvent filterEvents() { 
    return argThat(new ArgumentMatcher<ServerEvent>() { 
     @Override 
     public boolean matches(Object argument) { 
      return argument instanceof Type2; 
     } 
    }); 

我已经试过了,但得到的编译错误:

private <T> ServerEvent filterEvents() { 
    return argThat(new ArgumentMatcher<ServerEvent>() { 
     @Override 
     public boolean matches(Object argument) { 
      return argument instanceof T; 
     } 
    }); 

更新:

我也试过这个,但还是收到错误:

verify(loggerUtilsWrapper).writeEvent(filterEvents(MatchNotFoundEvent.class)); 


private ServerEvent filterEvents(final Class<MatcherEvent> eventType) { 
    return argThat(new ArgumentMatcher<ServerEvent>() { 
     @Override 
     public boolean matches(Object argument) { 
      return argument instanceof eventType; 
     } 
    }); 
} 

回答

4

由于运行时类型擦除,“T”不可用。标准方式是通过Class<T>类型的参数传递类型令牌

但是,在这种情况下,您不需要泛型,因为您实际上并未使用该类型。相反,只是传递一个Class对象并进行比较:

private ServerEvent filterEvents(final Class<?> c) { 
    return argThat(new ArgumentMatcher<ServerEvent>() { 
     @Override 
     public boolean matches(Object argument) { 
      return c.isInstance(argument); 
     } 
    }); 
5

您应该将Java泛型类型看作编译器的注释,而不是可以在代码中使用的东西,因为它们不存在于字节码级别。

如果您需要检查某个类型,则必须将该类传递给该方法。

这应该工作:

private ServerEvent filterEvents(final Class<?> clazz) { 
    return argThat(new ArgumentMatcher<ServerEvent>() { 
     @Override 
     public boolean matches(Object argument) { 
      return clazz.isInstance(argument); 
     } 
    }); 

编辑:

Java的instanceof运营商无法比拟对抗类引用的对象。它需要类名。 Class.isInstance()允许你to check instances dynamically

+2

我想你的意思是'clazz.isInstance(argument)'。 “java.lang.Class .instanceOf”方法似乎不存在。 – ApproachingDarknessFish 2014-10-21 22:03:37

+0

我得到“无法解析法‘clazz.instanceOf’ – 2014-10-21 22:05:12

+0

你是对的,谢谢!固定它。 – 2014-10-21 22:06:15

相关问题