Sunday, January 17, 2021

Java Generic Index

泛型的出現,解決了類型安全問題

泛型具有以下優點:

編譯時的強類型檢查

避免了類型轉換

泛型編程可以實現通用算法

通過使用泛型,程序員可以實現通用算法,這些算法可以處理不同類型的集合,可以自定義,並且類型安全且易於閱讀

 

泛型,即「參數化型態」,在不創建新型態的情況下,透過泛型指定的不同型態來控制形式參數具體限制的型態。

這種參數型態可以用在類別、介面和方法。

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 ;  
    }  
}

=====================================================================

如果我們可以用 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 ;  
    }  
}

=====================================================================

使用時候是這樣

=====================================================================

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();

=====================================================================

但如果改成這樣

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());
    }
}

=====================================================================

字母規範


=====================================================================

參考

Java Generic

 JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别

No comments:

Post a Comment

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能