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

如何使用泛型类类型编写java方法?,java,generics,types,instance,Java,Generics,Types,Instance,我想编写一个泛型方法(使用泛型或param) 这将取代这两个电话: private ServerEvent filterEvents() { return argThat(new ArgumentMatcher<ServerEvent>() { @Override public boolean matches(Object argument) { return argument instanceof Type1;

我想编写一个泛型方法(使用泛型或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服务器事件过滤器事件(){
返回argThat(新参数匹配器(){
@凌驾
公共布尔匹配(对象参数){
返回Type1的参数实例;
}
});
私有服务器事件筛选器事件(){
返回argThat(新参数匹配器(){
@凌驾
公共布尔匹配(对象参数){
返回Type2的参数实例;
}
});
我已尝试此操作,但出现编译错误:

private <T> ServerEvent filterEvents() {
    return argThat(new ArgumentMatcher<ServerEvent>() {
        @Override
        public boolean matches(Object argument) {
            return argument instanceof T;
        }
    });
private服务器事件过滤器事件(){
返回argThat(新参数匹配器(){
@凌驾
公共布尔匹配(对象参数){
返回参数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;
        }
    });
}
verify(loggerUtilsWrapper).writeEvent(filterEvents(MatchNotFoundEvent.class));
私有服务器事件筛选器事件(最终类事件类型){
返回argThat(新参数匹配器(){
@凌驾
公共布尔匹配(对象参数){
返回eventType的参数instanceof;
}
});
}

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

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

这应该起作用:

private ServerEvent filterEvents(final Class<?> clazz) {
    return argThat(new ArgumentMatcher<ServerEvent>() {
        @Override
        public boolean matches(Object argument) {
            return clazz.isInstance(argument);
        }
    });
专用服务器事件过滤器事件(最终类分类){
返回argThat(新参数匹配器(){
@凌驾
公共布尔匹配(对象参数){
返回clazz.isInstance(参数);
}
});
编辑:


Java的
instanceof
运算符无法将对象与类引用进行比较。它需要类名。
class.isInstance()
允许您使用。

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

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

private ServerEvent filterEvents(final Class<?> c) {
    return argThat(new ArgumentMatcher<ServerEvent>() {
        @Override
        public boolean matches(Object argument) {
            return c.isInstance(argument);
        }
    });
专用服务器事件筛选器事件(最终c类){
返回argThat(新参数匹配器(){
@凌驾
公共布尔匹配(对象参数){
返回c.isInstance(参数);
}
});

我想你的意思是
clazz.isInstance(argument)
。方法
java.lang.Class.instanceOf
似乎不存在。此解决方案中的泛型完全没有用处。可以去掉第一个参数,替换为第二个参数中的。