上一篇:掌握接口,从这三则案例开始! | 带你学《Java面向对象编程》之六十二
【本节目标】
通过阅读本节内容,你将复习一次关于向上、向下转型的实现方法,并意识到转型过程中可能会发生的风险。
泛型是从JDK1.5之后追加到Java语言里面的,其主要目的是为了解决ClassCastException的问题,在进行对象的向下转型时永远都可能存在有安全隐患,而Java希望通过泛型可以慢慢解决掉此类问题。
泛型的问题引出
现在假设定义一个描述x与y坐标的处理类,并且在这个类之中允许开发者保存三类数据:
- 整型数据:x = 10、y = 10 ;
- 浮点型数据: x = 10.1、y = 20.9 ;
- 字符串型数据: x = 东经120度、北纬30度;
class Point {
private x ;
private y ;
}
于是在设计Point类的时候就需要去考虑具体的x和y属性的类型,这个类型要求可以保存以上三种数据,很明显,最为原始的做法就是利用Object类来进行定义,因为存在有如下的转型关系:
- 整型数据:基本数据类型→包装为Integer类对象→自动向上转型为Object;
- 浮点型数据:基本数据类型→包装为Double类对象→自动向上转型为Object
- 字符串型数据:String类对象→自动向上转型为Object
范例:定义Point类如下
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 this.x ;
}
public Object getY() {
return this.y ;
}
}
而后下面进行内容的设置。
范例:进行正确的内容操作
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 this.x ;
}
public Object getY() {
return this.y ;
}
}
public class JavaDemo {
public static void main(String args[]) {
Point point = new Point() ;
//第一步:根据需求进行内容的设置
point.setX(10) ; //自动装箱
point.setY(20) ; //自动装箱
//第二步:从里面获取数据
int x = (Integer) point.getX() ;
int y = (Integer) point.getY() ;
System.out.println(“x坐标:” + x + “、y坐标:” + y) ;
} //执行结果:x坐标:10、y坐标:20
}
本程序之所以可以解决当前的设计问题,主要的原因在于,Object可以接收所有数据类型,但是正因为如此,所以本代码也会出现有严重的安全隐患。
范例:观察错误
public class JavaDemo {
public static void main(String args[]) {
Point point = new Point() ;
//第一步:根据需求进行内容的设置
point.setX(10) ; //自动装箱
point.setY(“北纬20度”) ; //自动装箱
//第二步:从里面获取数据
int x = (Integer) point.getX() ;
int y = (Integer) point.getY() ;
System.out.println(“x坐标:” + x + “、y坐标:” + y) ;
}
}
此时的程序明显出现了问题,如果在程序编译的时候,实际上是不会有任何错误产生的,而程序执行的时候就会出现“ClassCastException”异常类型,所以本程序的设计是存在有安全隐患的。而这个安全隐患存在的依据在于使用了Object类型,因为Object可以涵盖的范围太广了,而对于这样的错误如果可以直接出现在编译的过程之中,那么就可以避免运行时的尴尬。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学