我今天看到这样的代码:
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)
菱形正在做它一直做的事情——从上下文推断泛型类型,并保证构造函数调用不会危及类型安全。
考虑这个例子:
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)
此示例无法编译,因为无法推断出适当的类型。如果您删除菱形,它确实会编译,因为构造函数参数的类型是已删除的版本 (Object
和List
)。
在您的情况下,构造函数不接受任何参数,因此没有什么要检查的。但是,使用菱形是一个很好的习惯,即使您选择将构造函数调用的结果分配给Object
或 原始类型(而不是您应该使用原始类型)。