【本節目标】
通過閱讀本節内容,你将複習一次關于向上、向下轉型的實作方法,并意識到轉型過程中可能會發生的風險。
泛型是從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面向對象程式設計文章檢視此處