我看到的每个地方,我都看到 Collections 的输入是这样的:
Set<String> set = new HashSet<String>();
但是,我将 Collections 定义为此
Set<String> set = new HashSet();
我仍然可以进行类型检查(我的方式看起来更干净)。
创建泛型集合时可能还有什么需要做的?但是,让我们说我只想要一个HashSet of Strings,然后不是
Set<String> set = new HashSet();
足够?
答案 0 :(得分:6)
您在创建新集合时使用的是通用类。
泛型类必须获取它封装的泛型类型,否则它被视为Raw Type。
收集值的正确声明应该是:
Set<String> mySet = new HashSet<>();
由于Set<String>
大多数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<>();