面向對象中多態和泛型的關系


  在大家看到我的這篇文章時,我正在拜讀劉未鵬先生寫的《暗時間》,如果你有幸看到我的這篇博客,我希望你也可以看看這本書。好了閑話少敘,進入正題。

  在面向對象的Collection中處處體現泛型和多態的思想,且慢,由於泛型和多態兩者之間本身就有一定的相似性,讓我們先認清楚泛型和多態之后再進入話題。

  多態是面向對象最基本的概念之一,即要模糊父類和之類之間的區別,如何模糊呢?我們再來舉網絡上的那個例子:

class Aninal{ 叫;}//叫是動物的一個方法

class 貓 extend Animal{叫;}

class 狗 extend Animal{叫;}

Animal 狗 = new 狗();//這里用Animal來定義狗,沒用用狗來定義,真正是狗叫還是貓叫,是

Animal 貓 = new 貓();//看賦予它的對象,這樣真正實現了接口重用,一個對象可以調用

狗.叫();//Animal讓它叫,而具體是誰在叫,到時候就看賦予它的子類是哪一個了,同時還有於

貓.叫();//擴展,想象一下,當添加了雞之后,前面調用Animal的對象的方法都不用做任何修改。

  具體在Java中的Collection的Iterator是運用多態最典型的例子,想象一下,Collection中有么多類(ArrayList,LinkedList,HashSet,TreeSet等),如果對應於每個類都寫一個Iterarot,大家應該會知道這會有多臃腫了。但讓Collection繼承自Iterator(他們都屬於接口),其他這些類也都繼承自Iterator。還是舉個例子:

  Collection books = new HashSet();
  books.add(15);
  Iterator it = books.iterator();//在定義it時用接口Iterator,但在初始化的時候用的卻是       while(it.hasNext())              //HashSet類中實現的Iteratr()方法,即完全看子類賦予自己
  {              //的是什么,這樣就可以操作books中的對象。同時便於擴展
     int book = (int)it.next();
     System.out.println(book);
   }

  那我們知道了多態的概念之后,再來看泛型。List<T> list = new Arraylist<T>;這就是泛型的最常見的用法,其中T對應基本類型或自定義類,比如int,String。在我看來,引入泛型的本質就是為了安全,把編譯時能發現的錯誤不帶到運行時。比如上面那個books的例子,由於Collection中只要是繼承自Object的對象都可以添加進去,所以你既可以存int,也可以存String,還可以存自定義類,當存進去無法被強制轉換為int的對象時,int book = (int)it.next();這條語句在編譯期時無法發現錯誤的,只有在運行時才能發現錯誤,這樣對於整個系統都是不穩定的。而引入泛型之后,用T限制了傳入list中的對象的類型,當傳入不是T的類型時,程序就會提示錯誤,可以讓我們更早的發現錯誤。

  說了這么多,那我們來看看泛型和多態的關系。今天看到網上有個人說:泛型就是多態的一種特例,用多態即可實現泛型。乍一想好像挺有道理的,T可以根據傳入的類型來確定其行為,這不就是多態嗎?但又一想,多態是在繼承層面上的,即根據實際運行時候來確定具體的實現,而泛型是當我們使用這個泛型類時候再去確定這個類里面的成員具體什么類型的,兩者不是一個層次的,更不用提用多態實現泛型了。至於具體的實現大家可以自己去查查。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM