Java集合中的泛型與多態問題

來源:互聯網
上載者:User

Java集合中泛型指的是在建立集合的時候要同時指定集合中存放的物件類型,這樣做主要是基於型別安全方面的考慮。

比如假設我們要建立一個用於存放字串的ArrayList,我們通常使用如下的方式:

ArrayList<String> list = new ArrayList<String>();

注意角括弧及其裡面的內容,這樣我們的這個list中就只能存放String類型的對象,當我們試圖向這個list中添加非String類型的對象(引用)的時候,會編譯不通過,提示“找不到符號”(我覺得提示“找不到方法”更準確)。原因就是我們已經聲明ArrayList中存放的String類型,當我們向這個ArrayList中添加對象(引用)的時候,編譯器就會檢查你存放的是否是String類型,如果不是,便會編譯不通過,這就是所謂的型別安全問題。

在數組中存放對象(引用)的時候,編譯器也會進行檢查,當添加其他類型的對象的時候,編譯不會通過,提示“不相容的類型”。

上面介紹的是集合中的泛型問題,下面看一下集合中的多態問題,這才是本文的核心所在。

我們知道Java中的多態指的是:在程式中定義的某個引用變數具體所指向的類型和調用的方法在編碼時並不能確定,而只有在啟動並執行時候才能確定。簡單來說就是這樣的情況:你定義的引用變數是父類型,而你建立的對象是子類型,用這個父類型的引用變數指向這個子類型的對象,然後當你調用這個對象的方法的時候,具體是調用的父類的還是子類的方法只有在啟動並執行時候才能確定,可能調用的是父類的方法也有可能調用的子類的方法,這樣不用修改代碼,就可以讓成徐選擇多個啟動並執行狀態,這就是多態。(關於多態,不明白的去查書。)

關於多態,簡單理解就是適合父類的,必定也適合子類,即父類存在的地方也可以用子類來替換(而這其實對應一種設計原則,你也知道是吧,對,就是裡氏替換原則。這裡不介紹這個原則哈,只是順便提一下。)

基於此,我們考慮集合中多態的情況。

先假設有一個方法如下(Animal為某類,Dog是其一個子類):

public void method(Animal anim){}

根據多態,我們知道我們可以用子類替換父類,而Dog是Animal的子類即我們可以用一個Dog類型的對象作為該方法的參數,這沒問題吧。是沒問題的,我們繼續。

我們引入集合及泛型,假設有某方法如下:

public void method(ArrayList<Animal> anim){}

則按照多態,理論上我們可以傳遞如下參數:一個ArrayList<Dog>類型的對象(Dog為Animal的子類),理論上沒問題吧,而實際上卻是大有問題的,會編譯不通過。

這是為什麼呢?Dog為Animal的子類,父類存在的地方,子類就可以存在,這應該是沒錯的啊,這確實是沒有錯的,錯不在多態。我們可以反向思考一下,假設允許上面的情況發生,就是在需要一個ArrayList<Animal>對象的地方你傳入了ArrayList<Dog>對象,但接下來發生的情況是否會發生你就無法預料了,就是你在method中調用了anim.add(new Cat()),這是可以理解的吧(假設Cat是Animal的另一子類),因為方法的參數類型是ArrayList<Animal>類型的,即這個ArrayList中存放的是Animal,Cat是Animal的子類所以可以調用anim.add(new Cat()),但事實上你傳遞的確實ArrayList<Dog>類型的,即你向一個存放Dog的ArrayList中存放了其他的對象,根據泛型安全性問題,這是不允許的啊。所以假設不成立,即你不能向一個參數類型為ArrayList<Animal>的方法中傳遞ArrayList<Dog>類型的對象。(真TM的像用反證法證數學題啊,有木有啊!)

暈了沒,希望你沒有。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.