危险的转型操作 | 带你学《Java面向对象编程》之六十三

上一篇:掌握接口,从这三则案例开始! | 带你学《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的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:泛型带你规避风险 | 带你学《Java面向对象编程》之六十四
更多Java面向对象编程文章查看此处

上一篇:两种连接的表达 :left(right) join 和 (+)


下一篇:Storm集群中运行的各种组件及其并行