【Java数据结构】泛型

泛型存在的意义:

1.帮助进行类型检查

2.获取数组元素的时候不需要进行强制类型转换

为什么Object[]不能强转为Integer[]

因为Object[]中允许存放任何类型的数据,强转为Integer会不安全

那T[] arr = (T[]) new Object[10];(第一种使用泛型的方法)是什么道理???

→只是骗过了编译器,本质上还是T[] arr = new T[10]; 是不对的

第二种使用泛型的方法:

在泛型类中不实例化对象

T[] arr;

在构造方法中,调用Array.newInstance()方法,传参Class<T>和int capacity

基本类型和引用类型的比较

基本类型直接用==  >   <比较的是本身的值

引用类型不能直接用==比较,需要用到比较器compareTo、comparable

泛型类和泛型方法

在类名后面加上<>表示是个泛型类

class Alg<T extends Comparable<T>> {
    public T findMaxVal(T[] arr) {
        T tmp = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (tmp.compareTo(arr[i]) < 0) {
                tmp = arr[i];
            }
        }
        return tmp;
    }
}

在static后加上<>表示是个泛型方法

class Alg2 {
    public static<T extends Comparable<T>> T findMaxVal (T[] arr) {
        T tmp = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i].compareTo(tmp) > 0) {
                tmp = arr[i];
            }
        }
        return tmp;
    }
}

通配符

不同于泛型只有上界(extends父类)

如<T extends Number>,表示T一定是Number的子类

通配符有上界和下界(extends父类为上界 super为下界)

如<? extends Number> 

<? super Integer>表示?一定是Integer的父类

通配符的上界不能写入数据(不能set),只能读取数据(只能get)

因为写入数据需要知道具体的类是什么,比如同样是钱,美元不能直接赋值给人民币。但是读取数据不用,因为

下界反之,只能写入数据(可以set),不太能读取数据(不get):

同样是钱,所以把钱的属性赋给美元和人民币都不会有错误,所以可以赋值。而读取(get)数据时候,有可能会有赋值操作,如get人民币对象赋值给钱,就会导致向上转型,会出错。但是没有赋值的时候也可以读取。

所以通配符的下界一般用来添加元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值