为什么不用 Set<String> set = new HashSet() 而不是 Set<String> set = new HashSet<String>()?

Why not Set<String> set = new HashSet() instead of Set<String> set = new HashSet<String>()?

无论在哪里,我都看到 Collections 的输入是这样的:

Set<String> set = new HashSet<String>();

但是,我这样定义我的集合

Set<String> set = new HashSet();

而且我仍然进行类型检查(而且我的方法看起来更清晰)。

也许这与创建泛型集合有关?但是,假设我只想要一个 HashSet 字符串,那么就不是

Set<String> set = new HashSet();

够了吗?

您在创建新集合时使用了通用 class。

泛型class必须获取其封装的泛型类型,否则视为Raw Type.

集合值的正确声明因此应该是:

Set<String> mySet = new HashSet<>();

由于 Set<String>

上的声明,您的 JVM 将能够推断出 HashSet 中使用的泛型类型

大多数 IDE(例如 Eclipse 和 ItelliJ)都会将它们的 linter 配置为在使用原始类型时提供警告 class。可以抑制此警告,但这被认为是一种不好的做法。

参考文献:

奖金:

  • What is "Linting"?

在这个特定的用例中,您没有向构造函数传递任何参数,这没有区别。

但是,如果您使用的构造函数版本采用类型取决于类型变量的参数,那么如果您使用原始类型构造函数,编译器将不会正确检查类型。

这段不正确的代码编译由于原始类型,会造成堆污染:

List<Integer> foo = Arrays.asList(1, 2, 3);
Set<String> set = new HashSet(foo);

而适当地使用正确的类型参数会阻止它编译:

List<Integer> foo = Arrays.asList(1, 2, 3);
Set<String> set = new HashSet<String>(foo);

顺便说一句,如果你不想那么冗长,你可以使用 Java 7+ 中的菱形运算符:

Set<String> set = new HashSet<>();