Я недавно написал некоторый код для использования предикатов из библиотеки Guava для составления сложных предикатов в качестве фильтров для набора результатов.Я создал класс PredicateFamily, представляющий коллекцию предикатов для определенного домена в наборе результатов.Семейство Predicate также отслеживает, какие из предикатов являются активными, и предполагается, что следующий метод должен составлять один предикат из всех отдельных объектов семейства.
/**
* 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;
}
Это работало плавно при локальном запуске, но когда оно пришлопри выполнении этого через Hudson я получил следующую ошибку:
[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] ^
(эта каретка должна быть под открывающей скобкой Predicates.and)
Это довольно запутанно, насколько я могуСкажите, это должно удовлетворить подпись Предикатов.Проверяя Hudson, я обнаружил, что в Ubuntu он работал под 1.6.0_18, а для компилятора было установлено значение 1.5.0_22.
После некоторых исследований мы обнаружили, что следующий код удовлетворяет тестам и компилируется, однако мы теряем безопасность типовпри этом.
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;
}
Может кто-нибудь предложить какие-либо идеи относительно того, почему это не сработало?Мне бы очень хотелось знать.
Редактировать: Просто для информации, это работало под Guava r06, однако, проверяя журнал изменений с r07, я не вижу изменений в подписиPredicates.and.