Ela*_*nda 4 java generics types instance
我想写一个泛型方法(使用泛型或param)
这将取代这两个电话:
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;
}
});
Run Code Online (Sandbox Code Playgroud)
我试过这个,但得到了编译错误:
private <T> ServerEvent filterEvents() {
return argThat(new ArgumentMatcher<ServerEvent>() {
@Override
public boolean matches(Object argument) {
return argument instanceof T;
}
});
Run Code Online (Sandbox Code Playgroud)
更新:
我也尝试了这个,但仍然有编译错误:
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;
}
});
}
Run Code Online (Sandbox Code Playgroud)
您应该将Java泛型类型视为编译器的注释,而不是可以在代码中使用的东西,因为它们不存在于字节码级别.
如果需要检查类型,则必须将类传递给方法.
这应该工作:
private ServerEvent filterEvents(final Class<?> clazz) {
return argThat(new ArgumentMatcher<ServerEvent>() {
@Override
public boolean matches(Object argument) {
return clazz.isInstance(argument);
}
});
Run Code Online (Sandbox Code Playgroud)
编辑:
Java的instanceof运算符无法将对象与类引用进行比较.它需要类名.Class.isInstance()允许您动态检查实例.