Почему предикаты не компилируются должным образом в некоторых компиляторах? - PullRequest
2 голосов
/ 16 ноября 2010

Я недавно написал некоторый код для использования предикатов из библиотеки 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.

1 Ответ

4 голосов
/ 06 июля 2011

Немного поздно, но ... Я полагаю, что это можно исправить, указав общий тип:

ret = Predicates.<E>and( ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...