黑马程序员--08.泛型--01.【泛型概述】【泛型类】

来源:互联网 发布:webpack 压缩混淆js 编辑:程序博客网 时间:2021/06/16 02:33

泛型--1

      泛型概述     泛型类

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

1.    泛型基本概念

1). 泛型概述

(1). 泛型产生时间和目的

[1]. 泛型出现的时机:泛型是在JDK5之后出现的。

[2]. 泛型的引进主要目的:是用于解决安全问题,是一种类型安全机制

(2). 泛型的优势

[1]. 将运行时java.lang.ClassCastException异常转移到编译时错误

便于对程序的纠错。

[2]. *****避免了向下转型的麻烦!!!!

【一句话】

没有泛型,需要强制类型转换转换的不对,还会抛出java.lang.ClassCastException

有了泛型,强制类型转换可以省去。这样也能避免强制类型转换而产生的异常。

【示例】


如果使用泛型的话:



(3). 泛型的使用格式

【定义泛型】通过< >定义要操作的引用数据类型。

{1}.只要是通过< >自定义的标示符写入到其中,这个< >中的类型参数就被声明了,就可以在程序中使用了。

所以注意,< >实际上是定义泛型参数一种标示

{2}. 类型参数:写入到< >中的标示符称为类型参数。

【类型参数和普通类型的区别】

{1}. 普通类型通过import关键字进行导包之后,就可以直接定义这个普通类型的变量

{2}. 泛型中的类型参数是通过< >进行定义的。

              定义之后,就可以像普通类型一样被使用。可以定义这个类型参数的引用变量。

之所以要< >进行定义,就是类型参数无法通过import关键字进行导包

【注意】不可以基本数据类型,泛型中只能定义引用数据类型

【注意】集合框架中,ComparatorComparableIterator也都具有泛型

因为这些都会取到集合中具体的元素,所以带有泛型

2.    泛型类

1). 泛型出现前后的程序的扩展性

(1). 泛型出现之前,常用多态来提高程序的扩展性。

泛型出现之前,如果想把某个方法设置为比较通用的方法,可以采用多态来实现

[1]. 参数设置为父类的引用。所有该父类的子类实例可以传入该方法

[2]. 如果这个方法对任意类的实例可以使用,那么就将接受的参数设置为所有类的父类,Object类型

示例代码【1】:

class Worker{}

class StudentX{}

 

class Tool{

    private Objectobj;

   

    public Object getObj() {

        returnobj;

    }

 

    public void setObj(Object obj) {

        this.obj = obj;

    }

   

    /*

     * 采用所有类的父类

     * Object作为方法

     * 的参数以提高程序扩展性

     */

}

 

public class TestII{

    public static void main(String[] args) {

        Toolt =new Tool();

        t.setObj(new Worker());

        Workerw =(Worker)t.getObj();

        /**

         * 如果不小心写成了new StudentX() 

         * 那么Worker w =(Worker)t.getObj();就会出现

         * java.lang.ClassCastException: StudentXcannot be cast to Worker

         */

    }

}

【缺点】多态一定要伴随着向下转型的,如果转型错误,还可能会出现类型转换异常

(2). 泛型出现之后,可以用泛型来升华和简化多态操作带来的扩展性

基本思路仍然是多态

【优化办法】采用泛型对这里面涉及到的不确定的子类类型父类引用参数进行泛型改造

[1]. 参数设置为父类的引用----->修改为泛型限定,保证子类的元素可以传入

[2]. 参数传入所有类的父类引用,Object类型----->修改为泛型 (直接使用就可以,不用限定),保证子类的元素可以传入。

【示例代码】2

 

class Utils<T>{

    private Tobj;//将Object 设置为泛型

   

    public T getObj() {

        returnobj;

    }

 

    public void setObj(T obj) { //将父类引用Object obj改成T obj

        this.obj = obj;

    }

}

 

public class TestIV{

    public static void main(String[] args) {

        //采用泛型指定操作的数据类型

        Utils<Worker>u =new Utils<Worker>();

        u.setObj(new Worker());

       

        //省去了强制类型换的书写的麻烦和存在的潜在安全性问题

        Workerw =u.getObj();

    }

}

2). 何时定义泛型类

一个类操作另一个引用数据类型不确定的时候,原来父类或者Object进行扩展的地方可以采用泛型进行改造

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------