← 返回首页
JavaSE系列教程(五十)
发表时间:2020-02-02 01:54:28
讲解集合框架中使用泛型。

集合框架中使用泛型的目的是为了限制集合中的元素类型,从而就避免了在遍历元素时出现的向下转型的类型转换异常。

我们知道在使用集合的时候,由于集合中存放的元素没有做任何的限制,因此可以将任何对象保存到集合中。这样会导致在从集合中取出对象的时候,对象都被提升为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.往集合中添加元素时,元素类型一定要和泛型中指定的类型一致。泛型中不能书写基本数据类型(必须使用对应的包装类型)。