泛型参数的限制
在Java中,实例化泛型类时泛型参数不能使用基本类型,如List<int>这是不合法的,要存储基本类型则可以利用基本类型的包装类如List<Integer> 、List<Double>等,下面补充一下八种基本类型对应的包装类,和默认初始值
在Java中,实例化泛型类时泛型参数不能使用基本类型,如List<int>这是不合法的,要存储基本类型则可以利用基本类型的包装类如List<Integer> 、List<Double>等,下面补充一下八种基本类型对应的包装类,和默认初始值
Java虚拟机是不存在泛型类型对象的,所有的对象都属于普通类,甚至在泛型实现的早起版本中,可以将使用泛型的程序编译为在1.0虚拟机上能够运行的class文件,这个向后兼容性后期被抛弃了,所以后来如果用Sun公司的编译器编译的泛型代码,是不能运行在Java5.0之前的虚拟机的,这样就导致了一些实际生产的问题,如一些遗留代码如何跟新的系统进行衔接,要弄明白这个问题,需要先了解一下虚拟机是怎么执行泛型代码的。
虚拟机的一种机制:擦除类型参数,并将其替换成特定类型,没有指定特定类型用Object代替,如前文中的Couple类,虚拟机擦除后:
考虑一个这样的场景,计算数组中的最大元素。
[code01]
public class ArrayUtil {
public static <T> T max(T[] array) {
if (array == null || 0 == array.length) { return null ;}
T max = array[0];
for (int i = 1; i < array.length; i++) {
if (max.compareTo(array[i]) < 0) {max = array[i];}
}
return max;
}
}
仔细看看code01里面的代码(代码不完整),使用类型参数T定义一个max局部变量,这几意味着这个max可以是任意的类型,那么max.compareTo(array[i]) 方法的调用的前提是T所属的类中有compareTo方法,怎么能做到这一点呢?别着急,让我们来看看如何给类型参数进行限定,现在来对code01中的代码进行完善。
Java从1.0版本到现在的10+,中间Java5中发生了一个很重要的变化,那就是泛型机制的引入。Java5引入了泛型,主要还是为了满足在1999年指定的最早Java规范之一。经过了5年左右的时间,专家组定义了一套泛型规范,实现后通过测试投入到使用。所以说泛型是Java5以后才有的,欲知详情,继续往下看。
换个角度想,Java5引入泛型,必定是它能带来好处,否则牛气的Java工程师就要遭到吐槽了。我们来吐槽一下没有泛型的程序是怎么写的。