(没关系:) 它是非法的: HashSet<> f;
它是合法的:new HashSet<>();
从类型推断文档:
您可以替换调用构造函数所需的类型参数 具有一组空类型参数(&lt;&gt;)的泛型类的长度 因为编译器可以从上下文推断类型参数。
但是编译器在第二个例子中不能推断出类型参数,为什么要编译?
答案 0 :(得分:1)
泛型是一个编译时构造。也就是说,它用于强制给定的变量或方法只能使用特定类型或类型集。在您的情况下,编译器可以推断&#34;最广泛的类型 - Object
,因为HashSet
没有被分配或返回,所以类型永远不会在编译时使用。在运行时,由于type erasure,类型无意义。