它是什么意思:“from。<integer>”?</integer>

时间:2014-01-23 20:29:02

标签: java generics syntax expression

我看到了一个关于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();
}

谢谢!

3 个答案:

答案 0 :(得分:4)

答案 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
  1. In the first example,没有类型参数,信息太少 Sun编译器用来推断正确类型的类型推断算法。它推断 toList的参数是一个任意泛型类型的空数组而不是 一个空的整数数组,这会触发前面描述的未经检查的警告。 (Eclipse编译器使用不同的推理算法,并编译相同的行 正确没有显式参数。)
  2. In the second example,没有类型参数太多了 用于推断类型推断算法的信息是正确的 类型。您可能认为Object是整数的唯一类型 和一个字符串有共同之处,但实际上它们都是实现的 接口Serializable和Comparable。类型推断 算法无法选择这三种中哪一种是正确的类型。
  3. 通常,以下经验法则足以:

    在调用泛型方法时,如果有的话 是一个或多个对应于类型参数的参数,它们都具有 相同的类型然后可以推断出类型参数;如果没有论据那么 对应于类型参数或属于不同子类型的参数 预期类型,那么必须明确给出类型参数。

    传递类型参数的一些要点

    将类型参数传递给泛型方法调用时,它以角度显示 左边的括号,就像方法声明中一样。

    Java语法要求类型参数只能出现在使用虚线形式的方法调用中。甚至 如果方法toList是在调用代码的同一个类中定义的,我们就不能 缩短如下:

    List<Integer> ints = <Integer>toList(); // compile-time error
    

    这是非法的,因为它会使解析器混淆。