程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Java、C#泛型的一些個人看法

Java、C#泛型的一些個人看法

編輯:關於.NET

過去曾經有很長一段時間,直至現在,存在這樣的一種觀點,就是C#Java的實現更漂亮。《Think in java》的作者Bruce Eckel曾經公開質疑過Java 5提供的泛型。不過說實在,我一直不喜歡看Bruce Eckel的書,感覺上他不是一個有經驗有深度的技術人員。

  我也很長一段實現認同這樣的觀點,因為人雲亦雲!

  在C# 2.0支持泛型,而且在虛擬機級別支持,一開始接觸時,感覺是很震撼的,感覺到泛型從此走入主流應用開發了。和C++相比,沒有C++模板那樣強的功能,完全做不到產生式編程的效果,也做不到編譯期計算的效果,但是它簡單實用。

  Java 5也開始支持泛型,而且最終正式發行比C# 2.0要早,我之前就使用過Beta版本C#的泛型,也熟悉C++的模板語法,可能是內心的傲慢,或者是懶惰,開始時只是將就著按照傳統的經驗使用Java 5提供的泛型。

  對事物的一知半解總是令人困擾的,在閱讀分析JDK源碼時,總會遇到一些Java 5額外提供的泛型用法,一開始忽略不計,但是看多了總會注意到的。

  例如Java.util.Collections類中的sort方法和binarySearch方法的接口:

  public static void sort(List list, Comparator c); 
  public static int binarySearch(List> list, T key);

  extends和super這兩個關鍵字是C#和C++的泛型中都沒有的,為什麼需要這樣的功能呢?

  例如如下情形:

 

  class A { } 
  class B extends A {} 
  void addAll(List items) {}

  如下代碼:

  List aList = ; 
  List bList = ; 
  addAll(aList); //可以 
  addAll(bList); //編譯不通過 
  addAll(bList)是無法編譯通過的,這一點在Java、C#、C++中都是如此,怎麼辦呢?在Java中如下處理,修改addAll的接口,改為: 
  void addAll(List items) {}

  這樣,addAll(aList)和addAll(bList)都能夠編譯通過了。

  另外super關鍵在算法中更是好用,如上面介紹的Collections.sort方法。如果你想在C#中實現一個和Java.util.Collections.sort一樣的方法,你會發現那是做不到的!

  為什麼C#和C++無法提供這樣的功能呢?因為C#和C++都是運行時的泛型支持,bList和aList的類型是不一樣的,List和List的實際類型都是不一樣的,運行時對泛型的支持目前還無法象處理數組參數那樣具備協變能力。而Java的實現是編譯器的特性,這樣做的缺點就是性能沒有得到提升,但是可以提供更好的語法糖。

  想起ajoo以前發表的一個觀點,就是在應用開發中,泛型提供的關鍵是類型安全,性能反而是其次。我對此十分認同,重新審視Java的泛型,我們會發現其設計頗具創新,而且向後兼容良好!

  總結一下我的觀點:

  Java的泛型,語法有創新,更好用,向後兼容,編寫泛型算法更方便,但是沒有帶來性能提升。

  C#泛型,實現有創新,在虛擬機級別支持,運行時支持泛型,性能有提升,但是不好編寫泛型算法,不向後兼容。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved