使用Java泛型的动机是编译时候检测出错误,避免程序运行时候出错造成严重后果。
为了了解泛型的好处,看如下代码。
左边代码将c声明了一个引用变量,它的类型是Comparable,然后调用comparaTo方法来比较Date对象和一个字符串。这样的代码可以编译,但是运行时候会出错。
而右边代码也将c声明为一个引用,它的类型是Comparable,,然后调用comparaTo方法来比较Date对象和一个字符串。这个代码编译就会出错,因为传递给compareTo方法参数必须是Date类型。由于这个错误是在编译时候就被检测出来,因而泛型类型使程序更加可靠。
定义泛型类和泛型接口
通过泛型实现一个通用栈结构,代码如下
定义泛型方法
为了声明泛型类方法,将泛型类型至于static之后。例如:
通过编写通用的二分查找法来展示泛型方法。
上图是通用二分查找方法,其中有一个比较重要的概念就是通配泛型,它的作用是对一个泛型类型指定范围。上面方法
还有一个可能会存在疑惑的问题是下面的代码。
list[mid].compareTo(key),由代码可以看出list的实际参数其实是个Float包装类的数组,Float类并不存在compareTo方法。这里其实是编译的时候通过通配符进行类型转换。实际上述代码是转换为如下:
总结:使用Java泛型的动机就是在编译时候检测出错误,Java泛型允许定义泛型类,泛型接口和泛型方法,可以通过通配符来指定泛型类型的范围