java - 设计时泛型的问题

标签 java

我在设计过滤器框架时遇到了一些泛型问题。 我收到编译错误。我不明白以及如何解决。 我尝试过给予,但我认为这不是一个完美的方式。 编译出错后

The method filter(String, Filter<Product>) in the type
CollectionMapper3<Product> is not applicable for the arguments
(String, Filter<Object>)

代码:

public interface Filter<T> {
    public abstract boolean matches(T object);
}


public abstract class AttributeFilter3<T,C extends Comparable<C>> implements Filter<T> {
    String property;    
    Comparable<C> comparable;

    public AttributeFilter3(Comparable<C> comparable) {     
        this.comparable = comparable ;
    }

    public void setProperty(String property) {
        this.property = property;
    }

    protected abstract boolean compare(int value);

    @Override
    public boolean matches(T t) {       
        return false;
    }

    public static <T,C extends Comparable<C>> Filter<T> EQUALS(Comparable<C> comparable) {
        return new AttributeFilter4<T,C>(comparable) {
            @Override
            protected boolean compare(int result) {
                return result == 0;
            }
        };
    }

}


public class CollectionMapper3<T> {

    private Collection<T> collection;

    public CollectionMapper3(Collection<T> collection) {
        this.collection = collection;

    }

    @SuppressWarnings("rawtypes")
    public final CollectionMapper3<T> filter(String propertyName, Filter<T> filter) {
        Collection<T> result = new ArrayList<>();
        for (T t : collection) {
            if (filter instanceof AttributeFilter3) {
                ((AttributeFilter3) filter).setProperty(propertyName);
                if (filter.matches(t)) {
                    result.add(t);
                }
            }
        }
        collection = result;
        return this;
    }

    public Collection<T> getResult() {
        return collection;
    }

}


public class Client3 {
    public static void main(String[] args) {
        Collection<Product> allProducts = MockUtil.getAllProducts();
        // Here is the compilation error I am getting
        Collection<Product> result = new CollectionMapper3<Product>(allProducts)
                .filter("name", AttributeFilter3.EQUALS("sss")).filter("quantityInStock", AttributeFilter3.EQUALS(8))
                .getResult();
        System.out.println(result);

    }
}






public class Product {  

    private String name;

    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return name ;
    }

}

最佳答案

您没有提供任何信息来推断T当您调用AttributeFilter3.EQUALS("sss")时,所以 Java 将使用 Object .

您可以提供类型参数:

AttributeFilter3.<String, String>EQUALS("sss")

或者您可以更新方法签名以接受类型 token :

public static <T,C extends Comparable<C>> Filter<T> EQUALS(Comparable<C> comparable, Class<T> ignored) {

然后

AttributeFilter3.EQUALS("sss", String.class)

关于java - 设计时泛型的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39900165/

相关文章:

java - 如何从 ParseObject 创建完整的本地实体?

java - onContextItemSelected 到对话框

Java:使用 PDFBox 将国家字符写入 PDF

java - SWT 按钮上的 MouseClick 事件在哪里?

java - Struts Action 中的多个入口点(迁移 Struts 2.2.3 -> 2.3.1)

java.sql.Date 月份差异

java - 读取源代码,将cookies和字段数据传递到站点

java - 提供给 orElse() 的方法没有完全执行

java - 计算形状的中点

java - 编织外部 jar 中的 Aspectj