2010-11-16 30 views
2

J'ai récemment écrit du code pour utiliser des prédicats de la bibliothèque de goyave pour composer des prédicats complexes en tant que filtres pour un ensemble de résultats. J'ai construit une classe appelée PredicateFamily qui représente une collection de prédicats pour un domaine spécifique dans l'ensemble de résultats. La famille de prédicats suit également les prédicats actifs et la méthode suivante est supposée composer un seul prédicat à partir de tous les objets de la famille séparés.Pourquoi les prédicats ne semblent-ils pas se compiler comme prévu dans certains compilateurs?

/** 
* This method will AND together all the families and OR within the families 
* 
* @param families 
* @return 
*/ 
public static <E> Predicate<E> sumPredicates(Iterable<PredicateFamily<E>> families) { 
    Predicate<E> ret = Predicates.alwaysTrue(); 

    for (PredicateFamily<E> family : families) { 
     if (family.hasActivePredicates()) { 
          // family.getActive() returns List<Predicate<E>> 
      Predicate<E> or = Predicates.or(family.getActive()); 
      ret = Predicates.and(ret, or); 
     } 
    } 
    return ret; 
} 

Cela a fonctionné à merveille lors de l'exécution localement, mais quand il est venu à l'exécution de ce par Hudson j'ai eu l'erreur déconcertante suivante:

[javac] symbol : method and(com.google.common.base.Predicate<T>,com.google.common.base.Predicate<T>) 
[javac] location: class com.google.common.base.Predicates 
[javac]     ret = Predicates.and(ret, or); 
[javac]            ^

(que caret devrait être sous la parenthèse d'ouverture de prédicats. et)

C'était plutôt déroutant, d'après ce que je peux dire, cela devrait satisfaire la signature de Predicates.and. Vérification de Hudson J'ai trouvé qu'il fonctionnait sous 1.6.0_18 sous Ubuntu et le compilateur sur 1.5.0_22. Après quelques recherches, nous avons trouvé que le code suivant satisfait aux tests et compile, cependant nous perdons la sécurité de type.

public static <E> Predicate<E> sumPredicates(Iterable<PredicateFamily<E>> families) { 
    Predicate<E> ret = Predicates.alwaysTrue(); 

    for (PredicateFamily<E> family : families) { 
     if (family.hasActivePredicates()) { 
      Predicate<E> or = Predicates.or(family.getActive()); 
      ret = Predicates.and(Arrays.asList(ret, or)); 
     } 
    } 
    return ret; 
} 

Quelqu'un peut-il nous donner des idées pour expliquer pourquoi cela n'a pas fonctionné? J'aimerais vraiment savoir. Juste pour information, ceci fonctionnait sous Guava r06, cependant en vérifiant le log de changement de r07 je ne vois pas un changement dans la signature de Predicates.and.

+0

Quel est le message d'erreur complet du compilateur de Hudson? On dirait que c'est coupé. Aussi, compilez-vous localement avec le compilateur d'Eclipse ou 'javac'? Assurez-vous de nettoyer le projet et essayez de compiler localement avec 'javac' pour comparer les pommes aux pommes. Le compilateur d'Eclipse est moins strict avec certains cas d'utilisation de génériques que javac. –

+1

Aussi vous devriez probablement changer le titre de cette question pour "ne pas sembler fonctionner comme prévu dans certains compilateurs Java *" - il n'y a pas de JVM qui exécute votre code ici, vous avez des problèmes de compilateur. –

+0

C'était à peu près tout, la seule partie non incluse était le long nom de paquet et de classe et la phase "Can not find symbol" que je pensais être évident à partir des autres lignes de toute façon. Skaffman m'a battu pour changer le titre :) – BjornS

Répondre

4

Un peu en retard, mais ... je crois que cela peut être fixé en mettant dans le type générique:

ret = Predicates.<E>and(...