泛型类
- 与C++不同,在尖括号中不用写class,直接写T就代表了泛型
- 初始化,接收,返回,都是用Object,而不是强转T
- 尖括号的作用只是在使用模板类时能够指定存放的数据类型
- T可以进行继承,作用就是在实例化的时候类型必须是T继承的子类或者本身(泛型上界就是继承的这个类型,确定了一个泛型的上限)
// 泛型类,求指定类型数组的最大值
// 必须指定一个Compara的上限
class Alg<T extends Comparable<T>> {
public Object[] array = new Object[10];
public T compare(T[] obj) {
T max = obj[0];
for (int i = 0; i < obj.length; i++) {
if (obj[i].compareTo(max) > 0) {
max = obj[i];
}
}
return max;
}
}
实例化
与C++相同
原理
将所有的泛型T都擦除为Object,所以,在编译的时候才有泛型的概念,在运行的时候就没有泛型的任何信息了。
裸类型
是指一个泛型类不进行实例化直接使用,也可编译,但是不安全。(泛型是1.5才加上的,为了向下兼容,所以不报错)
几点注意
-
不能实例化泛型数组
-
尖括号中只能是引用类型,不能是基本类型(基本类型直接用基本类型数组即可) 基本类型:整数类型(byte\short\int\long),浮点类型(double\float),字符类型(char),布尔类型(boolean)
泛型方法
在定义方法的时候加上尖括号
要注意静态方法的static位置!!!
// 泛型方法
class Alg2 {
// 要比较大小必须确定泛型上界,对于Comparable进行继承
// 写成静态的直接通过类去调用,不用实例化对象(非静态去掉static即可)
public static<T extends Comparable<T>> T findMax(T[] obj) {
T max = obj[0];
for (int i = 0; i < obj.length; i++) {
if (obj[i].compareTo(max) > 0) {
max = obj[i];
}
}
return max;
}
}
调用:
//1
Alg2.findMax(arr);
//2
Alg2.<String>findMax(arr);