Java 泛型 (一)

來源:互聯網
上載者:User

泛型的分類

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 一樣    }}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.