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

时间:2014-10-21 21:53:43

标签: 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;
        }
    });

我试过这个,但是出现了编译错误:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

由于运行时类型擦除,&#34; T&#34;不可用。标准方法是通过Class<T>类型的参数传递类型标记

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

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