泛型的出現,解決了類型安全問題
泛型具有以下優點:
編譯時的強類型檢查
避免了類型轉換
泛型編程可以實現通用算法
通過使用泛型,程序員可以實現通用算法,這些算法可以處理不同類型的集合,可以自定義,並且類型安全且易於閱讀
泛型,即「參數化型態」,在不創建新型態的情況下,透過泛型指定的不同型態來控制形式參數具體限制的型態。
這種參數型態可以用在類別、介面和方法。
Generic Class
Generic Interface
Generic Method
1. 沒有泛型
分別設置 Integer 型態的點座標和 Float 類型的點座標
=====================================================================
// 設置 Integer 型態的點座標
class IntegerPoint{
private Integer x ; // 表示 X 座標
private Integer y ; // 表示 Y 座標
public void setX(Integer x){
this.x = x ;
}
public void setY(Integer y){
this.y = y ;
}
public Integer getX(){
return this.x ;
}
public Integer getY(){
return this.y ;
}
}
// 設置 Float 型態的點座標
class FloatPoint{
private Float x ; // 表示 X 座標
private Float y ; // 表示 Y 座標
public void setX(Float x){
this.x = x ;
}
public void setY(Float y){
this.y = y ;
}
public Float getX(){
return this.x ;
}
public Float getY(){
return this.y ;
}
}
class IntegerPoint{
private Integer x ; // 表示 X 座標
private Integer y ; // 表示 Y 座標
public void setX(Integer x){
this.x = x ;
}
public void setY(Integer y){
this.y = y ;
}
public Integer getX(){
return this.x ;
}
public Integer getY(){
return this.y ;
}
}
// 設置 Float 型態的點座標
class FloatPoint{
private Float x ; // 表示 X 座標
private Float y ; // 表示 Y 座標
public void setX(Float x){
this.x = x ;
}
public void setY(Float y){
this.y = y ;
}
public Float getX(){
return this.x ;
}
public Float getY(){
return this.y ;
}
}
=====================================================================
如果我們可以用 Object 來取代
=====================================================================
class ObjectPoint {
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 ;
}
}
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 ;
}
}
=====================================================================
使用時候是這樣
=====================================================================
ObjectPoint integerPoint = new ObjectPoint();
integerPoint.setX(new Integer(100));
Integer integerX = (Integer)integerPoint.getX();
ObjectPoint floatPoint = new ObjectPoint();
floatPoint.setX(new Float(100.12f));
Float floatX = (Float)floatPoint.getX();
integerPoint.setX(new Integer(100));
Integer integerX = (Integer)integerPoint.getX();
ObjectPoint floatPoint = new ObjectPoint();
floatPoint.setX(new Float(100.12f));
Float floatX = (Float)floatPoint.getX();
=====================================================================
但如果改成這樣
ObjectPoint floatPoint = new ObjectPoint();
floatPoint.setX(new Float(100.12f));
String floatX = (String)floatPoint.getX();
編譯時不會報錯,執行時,就會報錯,透過泛型的方法,就可以在編譯時檢查出
=====================================================================
2. 泛型類別
=====================================================================
//定義
class Point<T> {//此處可以隨便寫標識符號T
private T x;
//作為參數傳入
public void setX(T x){
this.x = x;
}
//作為返回值
public T getX(){
return this.x;
}
}
class TestGeneric1 {
public static void main(String[] args){
//IntegerPoint使用
Point<Integer> p1 = new Point<Integer>();
p1.setX(new Integer(100));
System.out.println(p1.getX());
//FloatPoint使用
Point<Float> p2 = new Point<Float>();
p2.setX(new Float(100.12f));
System.out.println(p2.getX());
}
}
=====================================================================
優點:
不用強制轉型
使用型態不對時,在編譯時間會報錯
=====================================================================
3. 多泛型參數型態及字母規範
=====================================================================
//定義
class MorePoint<T, U> { //多泛型參數型態 T, U
private T x;
private U name;
//作為參數傳入
public void setX(T x){
this.x = x;
}
public void setName(U name){
this.name = name;
}
//作為返回值
public T getX(){
return this.x;
}
public U getName(){
return this.name;
}
}
class TestGeneric2 {
public static void main(String[] args){
MorePoint<Integer, String> morePoint = new MorePoint<Integer, String>();
morePoint.setX(new Integer(1));
morePoint.setName("Java generic class.");
System.out.println(morePoint.getX() + ", " + morePoint.getName());
}
}
=====================================================================
字母規範
=====================================================================
參考
No comments:
Post a Comment