了解java中的泛型

泛型

泛型深入

泛型:是JDK5中引用的特性,可以在编译阶段约束操作的数据类型,并进行检查

泛型的格式:<数据类型>

注意:泛型只能支持引用数据类型

 

泛型的好处

1.统一数据类型

2.把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来

 

泛型的细节

  1. 泛型中不能写基本数据类型
  2. 指定泛型的具体类型后,传递数据时,可以传入该类型或者其子类类型
  3. 如果不写泛型,类型默认是Object

 

泛型类

使用场景:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类

格式:

修饰符 class 类名<类型>{     }

//当我在编写一个类时,如果不确定类型,那么这个类就可以定义成泛型类
public class FanXDemo1<E>{
    Object [] obj = new Object[10]; //创建一个Object类型的数组,默认长度为10
    int size;

    //E:表示不确定的类型,该类型在类名后已经确定过了  e:形参的名字,变量名
    public boolean add(E e){
        obj[size] = e;
        size++;
        return true;
    }

    public E get(int index){
        return (E) obj[index]; //根据传入的索引返回对应的元素,并将 Object 类型转换成 E 类型
    }

    @Override
    public String toString() {
        return Arrays.toString(obj); //打印数组中的所有元素
    }
}

 

泛型的方法

方法中形参内容不确定时,可以使用类名后面定义的泛型<E>

  1. 使用类名后面定义的泛型(所有方法都能用)
  2. 在方法申明上定义自己的泛型(只有本方法能用)

d5548a659b0b4575b0ad07f8a702337d.png

public class FanXDemo2 {
    //泛型不具备继承性 但是数据具备继承性
    public static void main(String[] args) {
        //创建集合的对象
        ArrayList<Ye> list1 = new ArrayList<>();
        ArrayList<Fu> list2 = new ArrayList<>();
        ArrayList<Zi> list3 = new ArrayList<>();

        //调用method方法
        method(list1);
        //method(list2); 报错
        //method(list3); 报错

        list1.add(new Ye());
        list1.add(new Zi());
        list1.add(new Fu());

    }
    //此时,泛型里面写的是什么类型,那么只能传递什么类型的数据
    public static void method(ArrayList<Ye> list){
    }
}

class Ye{
}
class Fu extends Ye{
}
class Zi extends Fu{
}

泛型接口

a00af413f643490e85f23c3245939195.png

泛型接口的两种使用方式
1.实现类给出具体的类型

2.实现类延续泛型,创建实现类对象时再确定类型

 

泛型的继承和通配符

泛型不具备继承性,但是数据具备继承性

public class FanXDemo3 {
    public static void main(String[] args) {
        //创建集合的对象
        ArrayList<Ye> list1 = new ArrayList<>();
        ArrayList<Fu> list2 = new ArrayList<>();
        ArrayList<Zi> list3 = new ArrayList<>();

        method(list1);
        method(list2);
        method(list3);
    }


    /*
     定义一个方法 形参是一个集合 但是集合中的数据类型不确定
     弊端:此时,他可以接受任意的数据类型
     本方法虽然不确定类型,但是希望值传递 Ye Fu Zi 等继承关系类
     此时就可以使用泛型的通配符
     应用场景:
     1.如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型接口和泛型方法
     2.如果类型不确定,但知道以后只能传递某个继承体系中的,就可以使用泛型的通配符
     泛型的通配符:
     关键点:可以限定类型的范围
     */
    public static<E> void method(ArrayList<? super Zi> list){

    }
}

泛型通配符:

? 表示不确定的类型 可以进行类型的限定
? extends E:表示可以传递E或者E所有的子类类型   <? extends Ye>
? super E:表示可以传递E或者E所有的父类类型   <? super Zi>

 

 

 

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CtrlCV 攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值