Jakob Jenkov 2014-06-23
Java 的 List 接口(java.util.List)可以被泛型化。换句话说,List 的实例可以指定一个类型,这样就只有该类型的实例才能被插入或从中读取。下面是一个示例:
List<String> list = new ArrayList<String>();
这个列表现在只接受 String 类型的实例,也就是说,只有 String 实例可以被放入该列表中。如果你试图向这个 List 中放入其他类型的对象,编译器会报错。
注意:泛型类型检查仅在编译时存在。在运行时,通过某些手段仍可能将非 String 对象插入到一个声明为 String 的 List 中。但这样做是不推荐的,属于不良实践。
访问泛型 List
你可以像下面这样获取和插入泛型 List 中的元素:
List<String> list = new ArrayList<String>();
String string1 = "a string";
list.add(string1);
String string2 = list.get(0);
请注意,从 List.get() 方法调用获取对象时不需要进行强制类型转换,这与非泛型 List 不同。因为编译器知道这个 List 只能包含 String 实例,所以无需显式转换。
遍历泛型 List
你可以使用迭代器(Iterator)来遍历泛型 List,如下所示:
List<String> list = new ArrayList<String>();
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String aString = iterator.next();
}
注意:从 iterator.next() 返回的对象也不需要强制类型转换。因为 List 已经被泛型化(指定了类型),编译器知道其中只包含 String 实例,因此即使通过其 Iterator 获取元素,也不需要类型转换。
你也可以使用增强型 for 循环(for-each loop):
List<String> list = new ArrayList<String>();
for(String aString : list) {
System.out.println(aString);
}
注意:在 for 循环的括号内声明了一个 String 类型的变量。在每次迭代(即遍历 List 中的每个元素)时,该变量都会包含当前的元素(当前的 String 对象)。