java 泛型和object比較

 

引言java

咱們使用object和泛型作形參,都是爲了讓這個方法能接收更多類型的對象,讓程序變得更健壯,代碼複用率更高。當咱們回看本身寫的代碼時會發現,好像使用泛型的地方使用object也能夠,使用object的地方使用泛型一樣能實現,那麼,本文就說一下,泛型和object的卻別算法

 

 

正題安全

先上舉例來講明一下object和泛型的使用場景吧,有這樣一個需求:寫一個數字排序的算法,咱們知道java中的數字類型有Double、Float、Byte、Short、Integer 以及 Long。測試

方法一:每種數字類型寫一個方法,須要寫6個方法spa

class Sort {
    void sort(Integer[] sort) {
        // 排序
    }

    void sort(Double[] sort) {
        // 排序
    }
}

方法二:使用object,只須要寫一個方法。code

class Sort {
    void sort(Object[] sort) {
        Number[] numbers = (Number[]) sort;
        // 排序
    }
}

方法三:使用泛型對象

class Sort {
    <T> void sort(T[] sort) {
        Number[] numbers = (Number[]) sort;
        // 排序
    }
}

好了,開始測試blog

public static void main(String[] args) {
        Test t=new Test();
        t.sort(new Integer[]{2,3});

        t.sort1(new Integer[]{2,3});

    }
    <T> void sort(T[] sort) {
        Number[] numbers = (Number[]) sort;
    }
    void sort1(Object[] sort) {
        Number[] numbers = (Number[]) sort;
        // 排序
    }

編譯沒毛病,運行也不會有毛病,別急咱們再寫一個列子排序

public static void main(String[] args) {
        Test t=new Test();
        t.sort(new String[]{"a","b"});

        t.sort1(new String[]{"a","b"});

    }
    <T> void sort(T[] sort) {
        Number[] numbers = (Number[]) sort;
        //排序
    }
    void sort1(Object[] sort) {
        Number[] numbers = (Number[]) sort;
        // 排序
    }

編譯沒毛病,運行一下:部署

 

咱們最頭疼的就是這種運行時的錯誤了,在大型項目中都須要編譯好後部署而後運行,因此你們都但願問題在編譯期就暴露出來,不要等到運行時才發現問題,那麼問題來了有沒有一種寫法可以讓他在編譯器發現問題呢?看下面這個例子

class Sort {
    <T extends Number> void sort(T[] sort) {
        Number[] numbers = (Number[]) sort;
        // 排序
    }
}

測試代碼

 

 顯然使用T extends這中寫法能讓問題在編譯期暴露

 

問題的解決方法有了,總結一下

一、使用object做爲形參當須要進行類型強制轉換時,編譯期不會檢查類型是否安全,運行期纔會檢查

二、泛型寫法範型的指定保證了代碼的健壯性,避免了強轉的風險.

完畢

結後語

我相信你們在寫這個算法時選形參的類型時,大部分猿都不會選object,而選Number,是的選Number作形參,一切問題都掃除了,可是本文只討論泛型的優勢

相關文章
相關標籤/搜索