【本節目标】
通過閱讀本節内容,你将接觸到泛型的概念,了解其規避轉型風險的原理,學會定義一個簡單的泛型類并能夠正确地執行個體化泛型類。
泛型定義
如果要想避免項目之中出現“ClassCastException”最好的做法是可以直接回避掉對象的強制轉換,是以在JDK1.5之後提供有泛型技術,而泛型的本質在于,類中的屬性或方法的參數與傳回值的類型可以由對象執行個體化的時候動态決定。
那麼此時就需要在類定義的時候明确定義占位符(泛型标記)。
class Point <T> { //T是Type的簡寫,可以定義多個泛型
private T x ;
private T y ;
public void setX(T x) {
this.x = x ;
}
public void setY(T y) {
this.y = y ;
}
public T getX() {
return this.x ;
}
public T 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) ;
}
}
此時Point中的x與y屬性的資料類型并不确定,而是由外部來決定。
提示:關于預設的泛型類型
- 由于泛型是屬于JDK1.5之後的産物,但是在這之前已經有不少程式類或者接口廣泛的應用在項目開發之中,于是為了保證這些類或接口追加了泛型之後,原始的程式類依然可以使用,是以如果不設定泛型類型時,自動将使用Object作為類型,以保證程式的正常執行,但是在編譯的過程之中會出現警告資訊。
泛型定義完成後可以在執行個體化對象的時候進行泛型類型的設定,一旦設定之後,裡面的x與y的屬性的類型就與目前對象直接綁定了。
class Point <T> { //T是Type的簡寫,可以定義多個泛型
private T x ;
private T y ;
public void setX(Integer x) {
this.x = x ;
}
public void setY(Integer y) {
this.y = y ;
}
public T getX() {
return this.x ;
}
public T getY() {
return this.y ;
}
}
public class JavaDemo {
public static void main(String args[]) {
Point<Integer> point = new Point<Integer>() ;
//第一步:根據需求進行内容的設定
point.setX(10) ; //自動裝箱
point.setY(20) ; //自動裝箱
//第二步:從裡面擷取資料
int x = point.getX() ;
int y = point.getY() ;
System.out.println(“x坐标:” + x + “、y坐标:” + y) ;
} //執行結果:x坐标:10、y坐标:20
}
現在的程式代碼之中,由于Point類裡面設定的泛型類型為Integer,這樣所有的對應此泛型的屬性、變量、方法傳回值全部替換為Integer(隻局限于此對象之中),這樣在進行處理的時候如果發現設定的内容有錯誤,則會在程式編譯的時候自動進行錯誤提示,同時也避免了對象的向下轉型處理(可以避免安全隐患)。
Point<String> pointB = new Point<String>() ;
泛型的使用注意點:
- 泛型之中隻允許設定引用類型,如果現在要操作基本類型必須使用包裝類;
從JDK1.7開始,泛型對象執行個體化可以簡化為“Point point = new Point<>()”;
使用泛型可以解決大部分的類對象的強制轉換處理,這樣的程式才是一個合理的設計。
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本内容視訊來源于
阿裡雲大學 下一篇:泛型類傳參小助手-泛型通配符 | 帶你學《Java面向對象程式設計》之六十五 更多Java面向對象程式設計文章檢視此處