Java8编译错误"inference variable D has incompatible bounds"
Java 8 compilation error "inference variable D has incompatible bounds"
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] method toSpecification in class xxx.repository.support.RangeSpecification cannot be applied to given types;
required: xxx.repository.support.Range
found: xxx.repository.support.Range
reason: inference variable D has incompatible bounds
equality constraints: capture#1 of ?
upper bounds: java.lang.Comparable
我需要编译的代码! Eclipse 构建没有错误,但使用 Java 1.8.191 编译时出错。
非常感谢。
其实代码应该是这样的:
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" 的绑定。一般来说,尽量避免通配符“?”只要有可能。
请注意,您必须重构该方法的所有调用方。
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] method toSpecification in class xxx.repository.support.RangeSpecification cannot be applied to given types;
required: xxx.repository.support.Range
found: xxx.repository.support.Range
reason: inference variable D has incompatible bounds
equality constraints: capture#1 of ?
upper bounds: java.lang.Comparable
我需要编译的代码! Eclipse 构建没有错误,但使用 Java 1.8.191 编译时出错。 非常感谢。
其实代码应该是这样的:
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" 的绑定。一般来说,尽量避免通配符“?”只要有可能。
请注意,您必须重构该方法的所有调用方。