使用通用 Set 接口时指定 HashSet 的类型有什么用?

Cla*_*den 3 java

如果实例化一个新的 HashSet,之后通常会使用 Set 接口来使用它。就像

Set<T> set = new HashSet();
Run Code Online (Sandbox Code Playgroud)

那么显式指定 HashSet 的类型有什么用呢?例如:

Set<T> set = new HashSet<T>();
Run Code Online (Sandbox Code Playgroud)

我在好几本书上见过它,但我根本想不出有什么用处。如果您需要访问该集合,无论如何您都将使用该界面(已参数化)。

Lau*_*ves 5

如果你这样说:

Set<T> set = new HashSet();
Run Code Online (Sandbox Code Playgroud)

您将收到未经检查的转换警告。的静态类型new HashSet()是原始 HashSet,从该类型转换为泛型类型可能不安全。

在其他情况下,进行赋值会导致发生类型推断。调用静态方法是典型的例子。例如:

Set<T> set = Collections.emptySet();
Run Code Online (Sandbox Code Playgroud)

然而, Java 不会对new运算符进行推断,因为这会给语言带来歧义。

如果您不喜欢冗余,您可以使用包装器静态方法,并且将进行推理。Google 的Guava就是这么做的,所以你可以说:

Set<T> set = Sets.newhashSet();
Run Code Online (Sandbox Code Playgroud)