设计时泛型问题

时间:2016-10-06 15:34:53

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

}

1 个答案:

答案 0 :(得分:1)

在您调用T时,您无法提供推断AttributeFilter3.EQUALS("sss")的任何内容,因此Java将使用Object

您可以提供类型参数:

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

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

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

然后

AttributeFilter3.EQUALS("sss", String.class)
相关问题