“泛型Java”,一個美麗的hype (轉)
“泛型”,一個美麗的hype
今天,Sun釋出了 1.5新特性的一個原型實現版本。這個執行在J2SE 1.4上的提供了J2SE 1.5主要的幾項新特性,例如型別的列舉、自動裝箱/拆箱、增強的for迴圈等,當然還有最受關注的JSR-14,泛型。:namespace prefix = o ns = "urn:schemas--com::office" />
在試用了這些新特性之後,我終於對Java的泛型徹底失望了。首先,我們來看看泛型Java的經典用法:
import java.util.*;
public class UseGeneric
{
public static void main(String[] args)
{
Vector
vi.add(new Integer(24));
vi.add(35);
for(Integer i : vi)
{
System.out.println(i);
}
}
}
上面的程式碼展示了泛型容器、自動裝箱和增強for迴圈三項新特性。的確,從簡化程式碼的角度來說,這些新特性有一定的幫助——當然,自動裝箱其實不應該算一項很有意義的特性,只是因為Java固有的兩套型別體制將int、char等原生型別與區分對待,所以在引入泛型容器時不得不採用自動裝箱作為補救。
將上面的程式碼編譯後的class進行反編譯,得到下列程式碼:
import java.io.PrintStream;
import java.util.Vector;
public class UseGeneric
{
public UseGeneric()
{
}
public static void main(String args[])
{
Vector vector = new Vector();
vector.add(new Integer(24));
vector.add(Integer.valueOf(35));
Integer integer;
for(SimpleIterator simpleiterator = vector.iterator(); simpleiterator.hasNext(); System.out.println(integer))
integer = (Integer)simpleiterator.next();
}
}
可以看到,所有的新特性都是在現有虛擬機器的基礎上實現的,沒有任何新鮮感可言。的確如Joshua Bloch所說的,只不過是把以前由員寫的一些程式碼轉成由來寫。
隨後我試圖實現一些略微高階的泛型技術,例如type traits。我寫了下列程式碼:
// General Traits
class NumTraits
{
public void doSomething()
{
System.out.println("General Traits");
}
}
// Specialized Traits
class NumTraits { public void doSomething() { System.out.println("Traits for Integer"); } } 可惜,這段程式碼不能透過編譯,編譯器提示“duplicate class”。顯然,編譯器並沒有把型別引數作為類名稱的一部分,因此traits是不可能實現的了。當然,在成員方法中可以編寫類似於模板特化(specialization)甚至偏特化(partial-specialization)的程式碼,但是下面的程式碼將證明這種東西毫無意義。 public class Happy { private T subject = new T(); public { subject.beHappy(); } public static void main(String[] args) { Happy o1.happy(); Happy o2.happy(); } } 這裡的編譯錯誤有兩種。首先,“private T subject = new T();”這個語句不能編譯,也許是我還沒有找到例項化型別引數的正確方法吧。更重要的是,編譯器提示“在java.lang.中找不到happy()方法”。由於Java採用“擦拭法”實現泛型,所有型別引數(除非顯式宣告超類或介面)都將被擦拭為Object,因此方法的契約仍然完全依賴物件來保證。換句話說,類似於模板特化之類的技巧不但在上毫無幫助,而且根本無法像C++那樣依賴編譯器進行比較高階的檢查甚至編譯期計算。Typelist?模板?還是不要想了吧。 喏,這就是所謂的“泛型Java”。沒有編譯期動態繫結,沒有type-traits,沒有(真正的)模板特化,一切的問題依然扔給RTTI來完成。我更願意把它叫做“Java with some type-safe containers”,而不是“Generic Java”。 泛型Java,一個美麗的hype——如果你對它有太多期望的話。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958289/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java的泛型詳解(一)Java泛型
- Web Service難道又是一個美麗的童話?Web
- 一個小栗子聊聊 JAVA 泛型基礎Java泛型
- 【java】【泛型】泛型geneticJava泛型
- java泛型之泛型方法。Java泛型
- Java泛型知識點:泛型類、泛型介面和泛型方法Java泛型
- java泛型之泛型陣列。Java泛型陣列
- Java 泛型Java泛型
- Java泛型Java泛型
- Java中的泛型Java泛型
- Java 集合列舉泛型(一)Java泛型
- Java隨筆-Java泛型的一點學習Java泛型
- 美麗的Zukitwo是Gnome 3.12上的第一個主題
- 美麗心靈
- 【一天一個基礎系列】- java之泛型篇Java泛型
- [譯] TypeScript 和 Babel:一場美麗的婚姻TypeScriptBabel
- Java 泛型原理Java泛型
- Java+泛型Java泛型
- java泛型一二Java泛型
- Java(7)泛型Java泛型
- Java-泛型Java泛型
- java泛型剖析Java泛型
- JAVA泛型類Java泛型
- 我理解的 Java 泛型Java泛型
- Java™ 教程(泛型的限制)Java泛型
- Java中的泛型方法Java泛型
- Java的泛型機制Java泛型
- Java泛型的那些事Java泛型
- 一個朋友學會Java泛型後直接薪資翻倍!Java泛型
- 泛型(一)泛型
- Java 基礎 一文搞懂泛型Java泛型
- 一. 重識Java之夯實泛型Java泛型
- 美麗天天秒模式開發_美麗天天秒商城系統搭建模式
- java泛型的侷限探究Java泛型
- Java泛型的PECS原則Java泛型
- Java 中泛型的協變Java泛型
- Java 中泛型的全面解析Java泛型
- 深入解析Java中的泛型Java泛型