我看到了一个关于criteriaBuilder的问题,并想出了这个问题......
这是什么意思from.<Integer> get("...
?
我从未在表达<Integer>
之前看过一点。
有人能告诉我一个例子吗?
链接:Compile error when using CriteriaBuilder
代码:
public List<BankAccount> findWithBalance(int amount) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<BankAccount> cq = cb.createQuery(BankAccount.class);
Root<BankAccount> from = cq.from(BankAccount.class);
ParameterExpression<Integer> balance = cb.parameter(Integer.class);
cq.select(from);
//Here is the trick!
Predicate predicate = cb.gt(from.<Integer> get("balance"), balance);
cq.where(predicate);
cq.orderBy(cb.asc(from.get("ownerName")));
TypedQuery<BankAccount> query = em.createQuery(cq);
query.setParameter(balance, amount);
return query.getResultList();
}
谢谢!
答案 0 :(得分:4)
这是对作为类型参数传入Integer
的泛型方法的调用。
见这里:
Java-syntax for explicitly specifiying generic arguments in method calls
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12
答案 1 :(得分:2)
尖括号用于Java泛型。在大多数情况下,可以推断出泛型的类型,但并非总是如此。有关此主题的讨论,请参阅Type Inference。他们使用的例子是:
void processStringList(List<String> stringList) {
// process stringList
}
processStringList(Collections.emptyList()); // Compile error!
processStringList(Collections.<String>emptyList()); // Ok!
显然在Java 8中,这不再是一个问题,因为编译器也会从方法参数推断出类型。
答案 2 :(得分:0)
来自 Java Generics and Collections
,
List<Integer> ints = Lists.<Integer>toList(); // first example
List<Object> objs = Lists.<Object>toList(1, "two"); // second example
In the first example
,没有类型参数,信息太少
Sun编译器用来推断正确类型的类型推断算法。它推断
toList的参数是一个任意泛型类型的空数组而不是
一个空的整数数组,这会触发前面描述的未经检查的警告。
(Eclipse编译器使用不同的推理算法,并编译相同的行
正确没有显式参数。)In the second example
,没有类型参数太多了
用于推断类型推断算法的信息是正确的
类型。您可能认为Object是整数的唯一类型
和一个字符串有共同之处,但实际上它们都是实现的
接口Serializable和Comparable。类型推断
算法无法选择这三种中哪一种是正确的类型。在调用泛型方法时,如果有的话 是一个或多个对应于类型参数的参数,它们都具有 相同的类型然后可以推断出类型参数;如果没有论据那么 对应于类型参数或属于不同子类型的参数 预期类型,那么必须明确给出类型参数。
传递类型参数的一些要点
将类型参数传递给泛型方法调用时,它以角度显示 左边的括号,就像方法声明中一样。
Java语法要求类型参数只能出现在使用虚线形式的方法调用中。甚至 如果方法toList是在调用代码的同一个类中定义的,我们就不能 缩短如下:
List<Integer> ints = <Integer>toList(); // compile-time error
这是非法的,因为它会使解析器混淆。