为什么不设置<string> set = new HashSet()而不是Set <string> set = new HashSet <string>()?

时间:2018-05-22 02:03:01

标签: java generics collections raw-types

我看到的每个地方,我都看到 Collections 的输入是这样的:

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

但是,我将 Collections 定义为此

Set<String> set = new HashSet();

我仍然可以进行类型检查(我的方式看起来更干净)。

创建泛型集合时可能还有什么需要做的?但是,让我们说我只想要一个HashSet of Strings,然后不是

Set<String> set = new HashSet();

足够?

2 个答案:

答案 0 :(得分:6)

您在创建新集合时使用的是通用类。

泛型类必须获取它封装的泛型类型,否则它被视为Raw Type

收集值的正确声明应该是:

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

由于Set<String>

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

大多数IDE(例如Eclipse和ItelliJ)都将其连接器配置为在使用Raw Type类时提供警告。这个警告可以被抑制,但这被认为是一种不好的做法。

参考文献:

加成:

答案 1 :(得分:1)

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

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

这个错误的代码由于原始类型而编译,并且会导致堆污染:

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<>();