淘先锋技术网

首页 1 2 3 4 5 6 7

一、泛型的引入

        例如:我向一个ArrayList集合中添加Person类的对象,但是不小心手贱添加了一个Boy类的对象,这就会导致如下结果。

        List list = new ArrayList();

        list.add(new Person("张三"));

        list.add(new Person("李四"));

        list.add(new Boy("王五"));

这时候编译器是不会报错的,运行的时候也不会报错。但是如果如下输出

for(Object o : list){

        Person person = (Person)o;

}

运行时,类型转换的时候 (Person)o;就会报错。

        传统的方式不能对加入到集合ArrayList中的数据类型进行约束(不安全)遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响 这就极大地降低了程序的健壮性,因此设计者针对此问题引入了泛型!

二、使用泛型的好处

1.提升了程序的健壮性和规范性

        针对上述问题,当我们采用泛型就会显得非常简单,只需要在编译类型后利用泛型指定一个特定类型,编译器就会自动检测出不符合规范的类并抛出错误提示:

        List<Person> list = new ArrayList();

        list.add(new Person("张三"));

        list.add(new Person("李四"));

                list.add(new Boy("王五"));

最后一个add的时候,编译器就会报错。

2.编译时,检查添加元素的类型,提高了安全性

3.减少了类型转换的次数,提高效率

  • 当不使用泛型时:
  • 当使用泛型时:

 4.在类声明时通过一个标识可以表示属性类型、方法的返回值类型、参数类型

 三、泛型常见用法

1.定义泛型接口

曾经写接口的时候都没有定义泛型,它默认的就是Object类,其实这样写是不规范的!

interface Im<U,R>{
    void hi(R r);
    void hello(R r1,R r2,U u1,U u2);
    default R method(U u){
        return null;
    }
}

在上述的泛型接口中已经规定传入其中的必须是U,R类的对象,那么当我们传入其他类的对象时就会报错,如图:

 2.定义泛型集合

List<Person> list = new ArrayList();