天天看點

【Java基礎】泛型

Num1:請不要在新代碼中使用原生類型

泛型類和接口統稱為泛型。每種泛型定義一組參數化的類型,構成格式是:類或接口名稱,接着用<>把對應于泛型形式類型的參數的實際參數清單括起來。比如:List是一個參數化的類型,表示元素類型為String的清單。最後一點,每個泛型都定義一個原生類型,raw type,即不帶任何實際類型參數的泛型名稱。

示例代碼:

從Java1.5發行版本開始,Java就提供了一種安全的替代方法,稱作無限制的通配符類型,如果使用泛型,但不确定或者不關心實際的類型參數,就可以使用一個問号代替。

那麼無限制通配類型Set<?>和原生類型Set之間有什麼差別呢?通配符類型是安全的,原生類型則不安全。

Num2:消除非受檢警告

當使用泛型程式設計時,會遇到許多編譯器警告,那麼該如何消除?

可以用@SuppressWarnings("unchecked")這個注解來禁止警告。需要注意的是,每當使用@SuppressWarnings("unchecked")注解時,都要添加一條注釋,說明為什麼這麼做是安全的,這樣可以幫助其他人了解代碼,更重要的是,可以盡量減少其他人修改代碼後導緻計算不安全的機率。

Num3:清單優先于數組

數組與泛型相比,有兩個重要的不同點。

首先,數組是協變的,泛型則是不可變的。

第二大差別:數組是具體化的,是以數組會在運作時才知道并檢查它們的元素類型限制。相比之下,泛型則是通過擦除來實作的,是以泛型隻在編譯時強化它們的類型資訊,并在運作時丢棄它們的元素類型資訊。

Num4:優先考慮泛型類和方法

示例類代碼:

如果類可以從泛型中收益一般,方法也一樣,靜态工具方法尤其适合于泛型化。

示例方法代碼:單例工廠模式

示例方法代碼:靜态方法模式

泛型方法一個顯著特征:無需明确指定類型參數的值,不像調用泛型構造器的時候必須指定一個類型。

簡而言之,使用泛型比使用需要在用戶端代碼中進行轉換的類型來的更加安全,也更加容易。