Переменная вывода ошибки компиляции Java 8 D имеет несовместимые границы

Java 8 не будет компилировать приведенный ниже код (Java 7 делала это нормально). Я немного понимаю ошибку, но понятия не имею, как исправить мой код, можете ли вы мне помочь?

Ошибка в этой строке:

spec = spec.and(toSpecification(range));

Мне явно нужно либо изменить переданный параметр, либо переписать код toSpecification, но ничего подходящего не нашел.

public class RangeSpecification {

    public static <E> Specification<E> andRangeIfSet(Specification<E> spec, final List<Range<E, ?>> ranges) {
        for (Range<E, ?> range : ranges) {
            if (range.isSet()) {
                spec = spec.and(toSpecification(range));
            }
        }
        return spec;
    }

    public static <E, D extends Comparable<? super D>> Specification<E> toSpecification(final Range<E, D> range) {
        Validate.isTrue(range.isSet(), "You must provide a usable criterion");
        return new Specification<E>() {
            /**
             * 
             */
            private static final long serialVersionUID = 1L;

            @Override
            public Predicate toPredicate(Root<E> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
                Predicate rangePredicate = null;

                if (range.isBetween()) {
                    rangePredicate = builder.between(root.get(range.getField()), range.getFrom(), range.getTo());
                } else if (range.isFromSet()) {
                    rangePredicate = builder.greaterThanOrEqualTo(root.get(range.getField()), range.getFrom());
                } else if (range.isToSet()) {
                    rangePredicate = builder.lessThanOrEqualTo(root.get(range.getField()), range.getTo());
                }

                if (rangePredicate != null) {
                    if (!range.isIncludeNullSet() || range.getIncludeNull() == Boolean.FALSE) {
                        return rangePredicate;
                    } else {
                        return builder.or(rangePredicate, builder.isNull(root.get(range.getField())));
                    }
                }

                // Pas de range
                if (range.getIncludeNull() == Boolean.TRUE) {
                    return builder.isNull(root.get(range.getField()));
                }

                if (range.getIncludeNull() == Boolean.FALSE) {
                    return builder.isNotNull(root.get(range.getField()));
                }

                throw new IllegalStateException("Vous devez passer un critère exploitable !!!(ne devrait jamais ce produire ici)");
            }
        };
    }
}

Полная ошибка:

/D:/xxx/repository/support/RangeSpecification.java:[23,33] метод toSpecification в классе xxx.repository.support.RangeSpecification не может применяться к заданным типам;
требуется: xxx.repository.support.Range< br> найдено: xxx.repository.support.Range
причина: переменная вывода D имеет несовместимые границы
ограничения равенства: захват №1 из ?
верхние границы: java.lang.Comparable

Мне нужен код, который компилируется! Eclipse строится без ошибок, но компилируется с ошибками Java 1.8.191. Спасибо заранее.


person Laure S.    schedule 26.12.2018    source источник


Ответы (1)


На самом деле код должен быть таким:

public static <E, D extends Comparable<? super D>> Specification<E> andRangeIfSet(Specification<E> spec, final List<Range<E, D>> ranges) {
    for (Range<E, D> range : ranges) {
        if (range.isSet()) {
            spec = spec.and(toSpecification(range));
        }
    }
    return spec;
}

Я не могу скомпилировать и протестировать это, но граница параметра "D" отсутствовала. В общем, старайтесь избегать использования подстановочного знака "?" везде, где это возможно.

Обратите внимание, что вам придется реорганизовать все вызывающие объекты этого метода.

person Dorian Gray    schedule 26.12.2018