引言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作形參,一切問題都掃除了,可是本文只討論泛型的優勢