Java@Ch21.Generics 2011.05.27
Outline Generics Defining Generic Classes and Interfaces Generic Methods [Sample code] GenericStack.java 、 GenericMethodDemo.java 、 WildCardDemo1.java、WildCardDemo2.java、 WildCardDemo3.java
Generics Java allow you to define generic classes, interface, and methods <Prior to JDK 1.5> Comparable c = new Date(); System.out.println(c.compareTo(“red”)); <JDK 1.5> Comparable<Date> c = new Date(); Compile 會過 但執行會錯 因為Date與String型態不符 Compile 時會檢查 Date與String型態是否符合
Defining Generic Classes and Interfaces 程式範例: GenericStack.java
使用Generic type 優點: Certain errors can be detected at compile time rather than at runtime. 易犯的錯: Constructor of GenericStack should be defined as (X) public GenericStack<E>() (O) public GenericStack()
Generic Methods 程式範例: GenericMethodDemo.java
Wildcard Generic Type 程式範例: WildCardDemo1.java WildCardDemo2.java
A wildcard generic type has three forms : ? Unbounded wildcard (same as ? extends Object) ? extends T bounded wildcard ? super T lower-bound wildcard (T is generic type)
• 泛型方法讓程式設計師可以用單一方法宣告,指定一組相關的方法。 • 泛型類別讓程式設計師可以用單一方法宣告,指定一組相關的類別。 • 泛型方法和類別是Java最強大的功能之一,可以達到軟體重用,並且可確保編譯時期型別安全性。
範例: Overloading 在編譯時期: 編譯器會判斷引數 integerArray的型別 並且試著找相對應型態的 printArray方法
範例: Generic method 如果幾個多載化方法對每種引數型別都做一樣的事,那麼這些多載化方法可以用泛型方法,寫起程式更簡潔、更方便。您可以寫單一個泛型方法宣告,就可以讓不同的引數型別呼叫。編譯器會依照傳給泛型方法的引數型別,適當地處理每個方法呼叫。
宣告printArray方法使用Object陣列當成參數就好。這樣就可以達到同樣的結果,因為任何Object都可以當成String輸出
常見的程式設計錯誤 宣告泛型方法時,在返回型別之前忘記放型別參數區,是一種語法錯誤。當編譯器遇到這種方法時,無法瞭解型別參數名稱。 對一個方法呼叫,如果編譯器找不到符合的非泛型或泛型方法宣告,就會發生編譯錯誤。 如果編譯器對一個方法呼叫,找不到符合的方法宣告,可是卻找到兩個以上的泛型方法符合,就會發生編譯錯誤。
程式練習: 將 Overloading 改成 Generic method 也就是使用泛型方法 printArray,印出陣列的元素