集合框架中使用泛型的目的是为了限制集合中的元素类型,从而就避免了在遍历元素时出现的向下转型的类型转换异常。
我们知道在使用集合的时候,由于集合中存放的元素没有做任何的限制,因此可以将任何对象保存到集合中。这样会导致在从集合中取出对象的时候,对象都被提升为Object类型,如果需要使用对象的特有方法,这时需要向下转型,就有可能发生类型转换异常。
例如:
public static void main(String[] args) {
List list = new ArrayList();
list.add("java");
list.add("null");
list.add(100);
Iterator it = list.iterator();
while(it.hasNext()){
String obj = (String) it.next();
System.out.println(obj);
}
}
会抛出:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
这个道理就好比,上学背的书包。按理说书包里面只能存放跟学习相关的图书,可是总有学生把玩具、食物也放进书包里面,这样不仅不卫生还是容易把书包弄脏。有没有办法能够阻止学生往书包里存在图书之外的生活用品呢?泛型就相当于贴在书包上的标签,规定了书包里面存放的物品的类型。
实现代码如下:
class Book{
}
class Food{
}
public class Test {
public static void main(String[] args) {
List<Book> list = new ArrayList<Book>();
list.add(new Book());
//list.add(new Food()); //错误食物不能添加到集合中。
}
}
通过上例,我们总结出泛型的基本用法如下:
泛型的书写格式:
<引用数据类型>
泛型在使用的时候,主要是限定数据类型,程序中加入泛型之后,操作数据的时候,类型一定要和泛型中指定的类型一致。泛型中不能书写基本数据类型(使用对应的包装类型)。
有了泛型我们在遍历集合元素时,就不会出现向下转型的类型转换异常的风险。 例如:
class Book{
private String name;
public Book(String name) {
this.name = name;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
'}';
}
}
class Food{
}
public class Test {
public static void main(String[] args) {
List<Book> list = new ArrayList<Book>();
list.add(new Book("三国演义"));
list.add(new Book("红楼梦"));
Iterator<Book> it = list.iterator();
while (it.hasNext()){
Book b = it.next();
System.out.println(b);
}
}
}
运行结果:
Book{name='三国演义'}
Book{name='红楼梦'}
小结:
1.集合框架中使用泛型的目的是为了限制集合中的元素类型,从而就避免了在遍历元素时出现的向下转型的类型转换异常。
2.往集合中添加元素时,元素类型一定要和泛型中指定的类型一致。泛型中不能书写基本数据类型(必须使用对应的包装类型)。