泛型存在的意义:
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人民币对象赋值给钱,就会导致向上转型,会出错。但是没有赋值的时候也可以读取。
所以通配符的下界一般用来添加元素