1 泛型的引出
现在要求定义一个表示 坐标的类(Point),这个类需要能保存数字:x = 10,y =20; 保存小数:x = 10.2 ,y = 20.4;保存字符串: x = 东经20度 , 北纬32度。
这三组数据不同之处就是数据类型不一致,必需要使用一种数据类型能同时保存这三种数据。所以我必须使用Object这种数据类型。
Point类:
测试数字:
测试小数:
测试字条串:
此时的代码已经利用了Object数据类型来解决了开发的问题,但是Object向下转换可能会发生ClassCastException的异常。
从JDK1.5之后添加泛型技术,它的核心意义在于:类在定义的时候,可以使用一个标记,此标记就表示类中的属性或者方法参数的类型标记,在使用的时候才动态设置类型。
修改后的Ponit:
测试:
在使用了泛型之后,类中的所有类型都动态设置的,面所有使用泛型标记的方法参数的类型都发生了改变。但是你使用泛型,只能采用的类型是类,不能使用基本类型,只能使用引用类型。
如果使用泛型类或者是接口时,没有设置泛型的具体类型,那么会出现编译时的警告,同时为了保证程序能正常运行,所有的泛型都相当使用了Object来设置泛型的类型。
JDK1.7后可以写成Point<String> point = new Point<>(),实例化的声明可以省略。
还要注意,一个方法不能使用泛型参数的重载,比如fun(Point <String> point)与fun(Point <Integer> point)不能共存,因为重载认的是参数的类型,与泛型无关,无论泛型是什么,方法的参数类型还是Ponit。正确的写法如下。
除了?号以外还有两种通配符
1 ? extends 类 :设置泛型上限,可以在声明和方法参数止使用;
2 ? super 类 :设置泛型下限 , 方法参数上使用。