Java 在使用泛型集接口时,指定哈希集的类型有什么用?

Java 在使用泛型集接口时,指定哈希集的类型有什么用?,java,Java,如果您实例化一个新的HashSet,您通常会在之后使用Set接口来处理它。就像 Set<T> set = new HashSet(); 那么,显式指定哈希集的类型又有什么用呢?例如: Set<T> set = new HashSet<T>(); 我在好几本书中都见过,但我想不出有什么用处。如果您需要访问集合,您将使用已经参数化的界面。如果您这样说: Set<T> set = new HashSet(); 然而,Java不会对新操作符进行推理,

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

Set<T> set = new HashSet();
那么,显式指定哈希集的类型又有什么用呢?例如:

Set<T> set = new HashSet<T>();
我在好几本书中都见过,但我想不出有什么用处。如果您需要访问集合,您将使用已经参数化的界面。

如果您这样说:

Set<T> set = new HashSet();
然而,Java不会对新操作符进行推理,因为这会在语言中引入歧义

如果您不喜欢冗余,那么可以使用包装器静态方法,并进行推断。谷歌就是这么做的,所以你可以说:

Set<T> set = Sets.newhashSet();

它有助于确保类型安全。在你的例子中,除了警告之外没有任何伤害,但是考虑以下:

Set one = new HashSet();
one.add("haha");
Set<Integer> two = one;
在本例中,由于我们对泛型类型参数很懒惰,因此最终得到了一组包含字符串的整数


然后,如果试图访问集合中的元素,则会出现类型转换错误,因为字符串不是整数。

在Java 7中,有一个新的菱形运算符:set set=new HashSet,它会自动设置类型。在本例中,它只保存1个字符,但有时泛型类型本身可以是一个参数化类型,长度为30个字符,因此在这种情况下,它保存了大量的键入。@toto2为我们工作。谢谢
Set one = new HashSet();
one.add("haha");
Set<Integer> two = one;