泛型程序设计

泛型程序设计基础

引入泛型的原因

  • 解决了在使用一些容器的时候对于数据类型的限定,比如在使用ArrayList集合的时候,在JDK5.0之前在里面维护的是一个Object类型在使用添加获取删除方法的时候都没有问题,所有数据类型的数据都可以向里面添加,但是在使用的时候需要进行数据类型的强制转换容易发生类型转换错误。

泛型类

  • 使用尖括号放置在类名的后面,可有一个或者多个类型,定义了如果调用者在使用这个类的时候,对这个类里面的一些数据进行处理必须是处理指定的类型的数据

    // 泛型类
    public class GenericDemo<T,V,S,U>{
        //这个方法对一些数据进行处理的时候某些数据必须是
        // T,V,S,U这些指定的数据类型
    }
    
  • 在java中E经常表示集合的元素类型K与V表示键与值T表示任意类型

  • 在使用的时候在类的尖括号中限定这些数据的具体类型

泛型方法

  • 泛型方法就是把泛型的位置指定在方法声明上

    public class GenericDemo {
        public static <T> T get(I[] arr){
            // 传递第一个未知类的数组,
            // 返回指定位置的未知类的数据
            return arr[2];
        }
        
    }
    
    
  • 泛型类型的方法的调用

    // 泛型类型方法的调用
    GenericDemo.<String>get({"1","2","3","4"})
        // 在方法名的前面限定数据类型
        // 在实际情况中可以省略方法名前面的数据类型
    

泛型代码与虚拟机

  • 在jvm中不存在不明数据类型的类与方法,所有的泛型类都对应一个原始类型,原始类型的名字就是删除了类型参数的泛型类型的名字,类型变量被擦除,并且限定类型用Object类替换

    // 泛型类如下
    public class yanshi<T>{
        // 对t类型的数据进行处理
        pulic void chuli(T t){
            t.class
        }
    }
    // 对应的原始类如下
    public class yanshi{
        // 对t类型的数据进行处理
        pulic void chuli(Object obj){
            obj.class
        }
    }
    
  • 如果是限定类型的泛型就用第一边界类型的变量来替换

    // 限定类泛型类如下
    public class yanshi<T extends Comparable &Serializable>{
    // 对指定泛型数据进行处理
        public void chuli(T t){
         t.class   
        }
    }
    // 对应原始类如下
    public class yanshi{
        public void chuli(Comparable t)
        t.class
    }
    
    

约束与局限性

  • 泛型不能使用八个基本类型byte short int long boolean char float double,因为在jvm进行变量擦除以后没有对应的数据类型

  • 不能抛出或者捕获泛型类的对象,泛型类不支持扩展Throwable接口

    public class Test <T> estends Exception{}
    //编译器会报错
    

泛型类型的继承规则

  • 两个类a与b有继承关系a继承于b ArrayList与ArrayList不存在继承关系

你可能感兴趣的:(java基础)