Jakob Jenkov 2021-03-10
Java 的 Set 接口(java.util.Set)可以被泛型化。换句话说,Set 的实例可以指定一个类型,这样就只有该类型的实例才能被插入或从中读取。
下面是一个示例:
Set<String> set = new HashSet<String>();
这个 Set 现在只接受 String 类型的实例,也就是说,只能将 String 实例放入这个 Set 中。如果你试图放入其他类型的对象,编译器会报错。
注意:泛型类型检查仅在编译时存在。在运行时,仍有可能通过某些手段绕过限制,向一个
String类型的 Set 中插入非String对象。但这样做是极不推荐的。
向泛型 Set 中添加元素
向泛型 Set 添加元素的方式与以往一样,使用 add() 方法:
Set<String> set = new HashSet<String>();
String string1 = "a string";
set.add(string1);
那么主要区别是什么呢?如果你尝试向上面示例中的 Set 添加一个非 String 类型的元素,编译器就会报错。这是一个非常有用的额外类型检查!
遍历泛型 Set
你可以使用迭代器来遍历一个泛型 Set,如下所示:
Set<String> set = new HashSet<String>();
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()) {
String aString = iterator.next();
}
注意:这里不需要对 iterator.next() 返回的对象进行强制类型转换。因为该 Set 已经被泛型化(指定了类型),编译器知道其中只包含 String 实例,因此从 Set 或其 Iterator 中获取的对象无需显式转换。
你也可以使用增强 for 循环(for-each loop):
Set<String> set = new HashSet<String>();
for(String aString : set) {
System.out.println(aString);
}
注意:在 for 循环的括号中声明了一个 String 类型的变量。在每次迭代(即 Set 中的每个元素)中,该变量都会包含当前的元素(当前的 String)。