泛型的分類
1. 泛型類與介面
2. 泛型方法
package generic;import java.util.ArrayList;import java.util.List;/** * 泛型類及泛型方法 */public class GenericClass<E> { private E data; public E getData() { return data; } // 泛型方法 // 這個方法可以通過Class對象產生任意對象的List public <T> List<T> getT(Class<T> cls, int size) { List<T> list = new ArrayList<T>(); try { for (int i = 0; i < size; i++) { // 其局限型就在於CLASS對應的類必須包含無參構造方法 list.add(cls.newInstance()); } } catch (Exception e) { e.printStackTrace(); } return list; }}package generic;public interface GenericInter<E> { E get();}package generic;public class GenericInterImpl implements GenericInter<String>{ @Override public String get() { return null; }}
泛型的邊界
package generic;public class Holder<E> { private E data; public void set(E e) { this.data = e; } public E get() { return data; }}package generic;public class BoundTest { // 原生形參方法 public void rawArgs(Holder holder, Object o) { holder.set(o); // 由於形參holder沒有指定其泛型資料類型,編譯會產生警告 Object obj = holder.get(); Integer i = (Integer) holder.get(); // 可能會有異常,因為無法知道holder裡放的是什麼類型的資料 // 所以編譯的時候會產生警告 } // 無界形參方法 public void unboundedArgs(Holder<?> holder, Object o) { // holder.set(0); // 這一句無法通過編譯,因為 Holder<?> 的意思是 holder 需要 // 指定確切的泛化資料類型,個人認為無界萬用字元 ? 的用處就是通知 // 編譯器這個 holder 需要指定確切的資料類型,而不能隨意用其他 // 類型去使用這個 holder Object obj = holder.get(); Integer i = (Integer) holder.get(); // 實際上唯一 get() 方法的傳回值唯一能匹配保證不會出錯的就只有 // Object 類而已 } // 確定下界的泛型 public <T> void wildSubType(Holder<? extends T> holder, T arg) { // holder.set(arg); // 這一句會編譯出錯,想象當我們調用這個方法的時候,我們會如何傳參,如下 // Holder<ArrayList> holder = new Holder<ArrayList>(); // Collection arg = new HashMap(); // wildSubType(holder, arg); // 意義想象上面的holder和arg傳入後,調用holder的set()方法會出現什麼 // 結果,這就是編譯器在確定泛型下界的時候為什麼不允許用 T 去替代 ? extends T // 的原因,因為 T 有可能是Map,而我們的 ? 卻是一個List T t = holder.get(); // 這一句可以執行,因為 ? extends T ,則 ? 肯定是一個 T 類型 } // 確定上界的泛型 public <T> void wildSuperType(Holder<? super T> holder, T arg) { holder.set(arg); // 這句可以執行,因為 ? super T, 則 T 必是 ? 的衍生類 // T t = holder.get(); // 這句無法編譯通過,因為 ? super T 未必就是 T, 就 ? 是一個Collection // 而 T 卻是一個 ArrayList 一樣 }}