How to write a java method with a generic class type?

I want to write a generic method (either using generics or with a parameter)

which will replace these two calls:

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;
        }
    });

I tried this but got compilation errors:

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

update:

I tried this too, but still got a compilation error:

    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
source share
2 answers

Due to the erasure of the runtime type, β€œT” is not available. The standard way is to pass a type marker using a type parameter Class<T>.

However, in this case you do not need a generic one because you are not actually using this type. Instead, just pass the class object and compare it:

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

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() .

+5

All Articles