原始类型上下文中的菱形运算符

ajb*_*ajb 10 java generics

我今天看到这样的代码:

public class GenClass<T> { ... }

//in some other class
GenClass g = new GenClass<>();
Run Code Online (Sandbox Code Playgroud)

是否<>在这里都一事无成?通常<>会告诉编译器根据上下文确定泛型参数,但在这种情况下没有上下文.但显然这是合法的.这和以下有什么区别吗?

GenClass g = new GenClass();
Run Code Online (Sandbox Code Playgroud)

Pau*_*ton 5

菱形正在做它一直做的事情——从上下文推断泛型类型,并保证构造函数调用不会危及类型安全。

考虑这个例子:

public class GenClass<T> {

    GenClass(T t, List<T> list) {}

    public static void main(String[] args) {
        GenClass m = new GenClass<>(1, new ArrayList<String>());  // Doesn't compile
    }
}
Run Code Online (Sandbox Code Playgroud)

此示例无法编译,因为无法推断出适当的类型。如果您删除菱形,它确实会编译,因为构造函数参数的类型是已删除的版本 (ObjectList)。

在您的情况下,构造函数不接受任何参数,因此没有什么要检查的。但是,使用菱形是一个很好的习惯,即使您选择将构造函数调用的结果分配给Object或 原始类型(而不是您应该使用原始类型)。

  • `GenClass g = new GenClass&lt;&gt;();` 会和 `GenClass g = new GenClass&lt;Object&gt;();` 一样吗? (2认同)