如何用泛型类类型编写java方法?

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)

Tim*_*sen 5

您应该将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()允许您动态检查实例.

  • 我认为你的意思是`clazz.isInstance(argument)`.方法`java.lang.Class <?>.instanceOf`似乎不存在. (2认同)