在面向对象的开发中,利用对象的多态性可以解决方法参数的统一问题,但是随之而来也会带来有一个新的问题:“向下转型会存在类转换异常(ClassCastException)”,所以向下转型的操作并不是安全的,那么为了解决这样的问题,从JDK 1.5开始提供有泛型技术
泛型的引出
Ø 现在假设要开发一个GIS系统(地理信息系统、Geographic Information System),则肯定需要一个可以描述坐标的类(Point),同时在这个类里面要求保存有以下几种类型的坐标:
Ø 保存数字:x = 10、y = 20;
Ø 保存小数:x = 10.2、y = 20.3;
Ø 保存字符串:x = 东经20度、y = 北纬15度。
Ø 现在这个Point类设计的关键就在于x与y这两个变量的数据类型选择上。必须有一种数据类型可以保存这三类数据,那么首先想到的一定是Object类型,因为此时会存在有如下的转换关系:
Ø int数据类型:int自动装箱为Integer,Integer向上转型为Object;
Ø double数据类型:double自动装箱为Double,Double向上转型为Object;
Ø String数据类型:直接向上转型为Object。
定义Point类,使用Object作为属性类型
class Point { // 定义坐标
private Object x ; // 可以保存任意数据
private Object y ; // 可以保存任意数据
public void setX(Object x) {
this.x = x;
}
public void setY(Object y) {
this.y = y;
}
public Object getX() {
return x;
}
public Object getY() {
return y;
}
}
在Point类里面保存整型数据
public class TestDemo {
public static void main(String[] args) {
// 第一步:根据需要设置数据,假设此时的作用是传递坐标
Point p = new Point() ; // 实例化Point类数据
p.setX(10); // 设置坐标数据
p.setY(20); // 设置坐标数据
// 第二步:根据设置好的坐标取出数据进行操作
int x = (Integer) p.getX(); // 取出坐标数据
int y = (Integer) p.getY(); // 取出坐标数据
System.out.println("x坐标:" + x + ",y坐标:" + y);
}
}
程序执行结果:
x坐标:10,y坐标:20
public class TestDemo {
public static void main(String[] args) {
// 第一步:根据需要设置数据,假设此时的作用是传递坐标
Point p = new Point() ; // 实例化Point类数据
p.setX("东经100度"); // 设置坐标数据
p.setY(10) ; // 设置坐标数据,数据错误
// 第二步:根据设置好的坐标取出数据进行操作
String x = (String) p.getX(); // 取出坐标数据
String y = (String) p.getY(); // 取出坐标数据
System.out.println("x坐标:" + x + ",y坐标:" + y);
}
}
程序执行结果:
Exception in thread "main" java.lang.ClassCastException:java.lang.Integer cannot be cast to java.lang.String
atcom.yootk.demo.TestDemo.main(TestDemo.java:26)
使用泛型修改Point类
// 此时设置的T在Point类定义上只表示一个标记,在使用的时候需要为其设置具体的类型
class Point<T> { // 定义坐标,Type = 简写T,是一个类型标记
private T x ; // 此属性的类型不知道,由Point类使用时动态决定
private T y ; // 此属性的类型不知道,由Point类使用时动态决定
public void setX(T x) {
this.x = x;
}
public void setY(T y) {
this.y = y;
}
public T getX() {
return x;
}
public T getY() {
return y;
}
}
使用Point类将泛型类型设置为
Stringpublic class TestDemo {
public static void main(String[] args) {
// 第一步:根据需要设置数据,假设此时的作用是传递坐标
Point<String> p = new Point<String>() ; // 实例化Point类数据,设置泛型类型为String
p.setX("东经100度"); // 设置坐标数据
p.setY("北纬20度") ; // 设置坐标数据
// 第二步:根据设置好的坐标取出数据进行操作
String x = p.getX(); // 取出坐标数据,不再需要强制转换
String y = p.getY(); // 取出坐标数据,不再需要强制转换
System.out.println("x坐标:" + x + ",y坐标:" + y);
}
}
错误的程序