【JavaSE】- 5min拿下泛型!

泛型

    • 1.1 泛型的定义
    • 1.2 泛型细节
    • 2.1 泛型类
    • 2.2 泛型方法
    • 2.3 泛型接口
    • 2.4 泛型的通配符

1.1 泛型的定义

  • 泛型的介绍

提供了编译时类型安全检测机制

  • 泛型的好处

    1. 把运行时期的问题提前到了编译期间
    2. 避免了强制类型转换,造成了代码的不优雅
  • 泛型的定义格式

    • <类型>: 指定一种类型的格式.尖括号里面可以任意书写,一般只写一个字母.例如:
    • <类型1,类型2…>: 指定多种类型的格式,多种类型之间用逗号隔开.例如:
public class Generics01 {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add(123);
        arrayList.add("abc");
        
        Iterator iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            // 多态的弊端就是不能调用子类的特有方法
            String str = (String)next;
            System.out.println(str.length());
        }
    }
}

在这里插入图片描述
可以看到,我们在集合中可以添加不同类型的元素,但是如果想调用其中一个元素的特有的方法则需要强转,但是这个方法在123这个元素中没有呀,这时,泛型的作用就体现出来了!

        ArrayList<String> arrayList = new ArrayList<>();
        //arrayList.add(123); // err 
        arrayList.add("abc");

        Iterator<String> iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            String next = iterator.next();
            // 多态的弊端就是不能调用子类的特有方法
            System.out.println(next.length());
        }

但是需要注意, arrayList.add(123); 是添加不进去的,因为指定了泛型的类型是String,所以只能在集合中添加String类型的元素

1.2 泛型细节

1.泛型中不能写基本数据类型
2.指定泛型的数据类型后,可以传入该类型的子类型和本身
3.如果不写泛型,默认为Object类型

1.可以看到集合中是不能存放基本数据类型的,所以可以存放引用数据类型

在这里插入图片描述

2.可以看到当前add方法添加的数据类型为Integer

在这里插入图片描述

        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);

3.这里Tiger是Animal的子类,可以看到,子类是可以传入的

        ArrayList<Animal> animals = new ArrayList<>();
        animals.add(new Animal("人",16));
        animals.add(new Tiger("赔钱虎",20));

这里上下两种写法都是一样的,不指定泛型就默认为object类型

        ArrayList<Object>  list1 = new ArrayList<>(); 
        ArrayList list2 = new ArrayList(); 

2.1 泛型类

【JavaSE】- 5min拿下泛型!_第1张图片

运行结果

在这里插入图片描述

2.2 泛型方法

【JavaSE】- 5min拿下泛型!_第2张图片

2.3 泛型接口

List是一个泛型接口,表示该接口可以操作的元素类型是String
【JavaSE】- 5min拿下泛型!_第3张图片
【JavaSE】- 5min拿下泛型!_第4张图片

2.4 泛型的通配符

泛型不具备继承性,但集合中的数据具备

public class generics01 {
    public static void main(String[] args) {
        ArrayList<Father> fathers = new ArrayList<>();
        ArrayList<Son> sons = new ArrayList<>();

        fathers.add(new Father()); // ok
        fathers.add(new Son()); // ok

        m(fathers);
        //m(sons); //err 
    }

   
    public static void m(ArrayList<Father> arrayList) {

    }
}

class Father {

}

class Son extends Father{

}

在m方法中,传递过来的参数只能是 ArrayList 不能是子类

  < ? extends GrandFather> 代表只能传递GrandFather类及其子类
  < ? super Father>        代表只能传递Father类及其父类
public class generics02 {
    public static void main(String[] args) {

        ArrayList<GrandFather> grandFathers = new ArrayList<>();
        ArrayList<Father> fathers = new ArrayList<>();
        ArrayList<Son> sons = new ArrayList<>();
     
        m1(grandFathers);
        m1(fathers);
        m1(sons);

        m2(grandFathers);
        m2(fathers);
        // m2(sons);  // error
    }

    /*
        < ? extends GrandFather> 代表只能传递GrandFather类及其子类
                 代表只能传递Father类及其父类
     */
    public static void m1(ArrayList< ? extends GrandFather> arrayList) {

    }

    public static void m2(ArrayList<? super Father> arrayList) {

    }
}

【JavaSE】- 5min拿下泛型!_第5张图片

你可能感兴趣的:(java)