2016-10-06 3 views
0

Ich habe einige Probleme in Generics beim Entwerfen eines Filter-Framework. Ich erhalte einen Kompilierungsfehler. Ich verstehe nicht und wie ich mich versehe. Ich versuchte zu geben, aber ich denke, das ist kein perfekter Weg. Nach dem KompilierungsfehlerProblem mit Generics beim Entwerfen

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

Code:

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

} 
+0

Methodenparameter als Gleichgestellte definieren (C vergleichbar) anstelle von EQUALS (vergleichbar vergleichbar) – Palamino

Antwort

1

Sie bieten nichts von dem T zu schließen, wenn Sie AttributeFilter3.EQUALS("sss") aufrufen, so Java Object verwenden.

können Sie entweder Typ Parameter liefern:

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

oder Sie können die Methodensignatur aktualisieren, um einen Typ-Token zu akzeptieren:

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

dann

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

Danke !! Der erste funktioniert wie ein Zauberspruch. Die zweite Möglichkeit, die Sie gegeben haben, konnte damit nicht gelingen ... – user414967

Verwandte Themen