【JavaSE】- 5min拿下泛型!

1.1 泛型的定义

  • 泛型的介绍

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

  • 泛型的好处

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

    • <类型>: 指定一种类型的格式.尖括号里面可以任意书写,一般只写一个字母.例如:
    • <类型1,类型2…>: 指定多种类型的格式,多种类型之间用逗号隔开.例如: <E,T> <K,V>
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 泛型类

在这里插入图片描述

运行结果

在这里插入图片描述

2.2 泛型方法

在这里插入图片描述

2.3 泛型接口

List<String>是一个泛型接口,表示该接口可以操作的元素类型是String
在这里插入图片描述
在这里插入图片描述

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<Father> 不能是子类

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

    }

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

    }
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值