一、泛型的概念

所谓 泛型 就是允许在定义类 、 接口 时 通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型 。 这个类型 参数 将 在使用时 例如继承或实现这个接口 用这个类型声明变量 、 创建对象时 确定 即传入实际的类型参数 也称为类型实参 。

二、泛型在集合中的使用

  1. ArrayList arrayList = new ArrayList();这个list集合里面任何类型的数据都可以添加进去,这使得类型非常不安全,每次取出来的值都不确定是什么类型。增加泛型之后ArrayList<String> arrayList = new ArrayList(); 这个list集合里面就只能存放String类型的数据,读取出来非常方便,不用担心类型转换异常ClassCastExceprtion
  2. public class Generic {
     public static void main(String[] args) {
         ArrayList<String> list = new ArrayList<>();
         list.add("123");
         list.add("456");
         list.add("789");
    //        list.add(123);// add(java.lang.String) in ArrayList cannot be applied to (java.lang.Integer)
         Iterator<String> iterator = list.iterator();
         while (iterator.hasNext()){
             System.out.println(iterator.next());
         }
     }
    }

三、泛型类、泛型接口

  1. 经验:泛型要使用一路都用。要不用,一路都不要用。

  2. 泛型的指定中不能使用基本数据类型,可以使用包装类替换。

  3. 结论:子类必须是“富二代”,子类除了指定或保留父类的泛型,还可以增加自己的泛型

  4. 唯一的例外的是null,它是所有类型的成员。

    class Father<T,E>{
    }
    // 继承有泛型的类,可以选择性继承,也可以自己增加
    class child01<T,F> extends Father{
    }
    // 可以选择全部继承
    class child02<T,E> extends Father{
    }
    // 可以选择全部都不继承
    class child03 extends Father{
    }
  5. 泛型类

    class Father<T,E>{
     private T ele;
     private E ele1;
    
     public Father(T ele, E ele1) {
         this.ele = ele;
         this.ele1 = ele1;
     }
    
     public Father() {
     }
    
     public T getEle() {
         return ele;
     }
    
     public void setEle(T ele) {
         this.ele = ele;
     }
    
     public E getEle1() {
         return ele1;
     }
    
     public void setEle1(E ele1) {
         this.ele1 = ele1;
     }
    }
  6. 泛型方法
    方法,也可以被泛型化,不管此时定义在其中的类是不是泛型类。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。
    泛型方法的格式:[访问权限] <泛型> 返回类型 方法名([泛型标识 参数名称]) 抛出的异常

     public <G> G  test(G g){
         return g;
     }