首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Set<String> set =新HashSet()而不是Set<String> set =新HashSet<String>()?

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

Stack Overflow用户
提问于 2018-05-22 02:03:00
回答 2查看 4.2K关注 0票数 0

无论我看什么地方,我都能看到这样的集合类型:

代码语言:javascript
复制
Set<String> set = new HashSet<String>();

然而,我这样定义我的收藏品

代码语言:javascript
复制
Set<String> set = new HashSet();

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

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

代码语言:javascript
复制
Set<String> set = new HashSet();

足够的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-22 02:10:07

在创建新集合时使用泛型类。

泛型类必须得到它封装的泛型类型,否则它被认为是生料型

因此,对集合值的适当声明应是:

代码语言:javascript
复制
Set<String> mySet = new HashSet<>();

由于在HashSet上的声明,JVM将能够推断出在Set<String>中使用的泛型类型。

大多数IDE(例如)都会配置它们的指针,以便在使用Raw类时提供警告。这个警告可以被抑制,但这被认为是一种不好的做法。

参考文献:

奖励:

票数 7
EN

Stack Overflow用户

发布于 2018-05-27 19:07:01

在这个特定的用例中,如果不向构造函数传递任何参数,则没有什么区别。

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

此错误代码由于原始类型而编译,并将导致堆污染:

代码语言:javascript
复制
List<Integer> foo = Arrays.asList(1, 2, 3);
Set<String> set = new HashSet(foo);

然而,适当地使用适当的类型参数可以阻止它编译:

代码语言:javascript
复制
List<Integer> foo = Arrays.asList(1, 2, 3);
Set<String> set = new HashSet<String>(foo);

顺便说一句,如果您不想这么冗长,可以在Java 7+中使用菱形操作符:

代码语言:javascript
复制
Set<String> set = new HashSet<>();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50458772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档