最近一個朋友做猜數字游戲的解法,我也嘗試了一下,在做數據生成器的時候,就希望做一個類型無關的,其實這個問題在去迅雷面試的時候就被問到,不過當時想都沒想就放棄了,雖然面試當天回來的時候,完成了一下,但結果還是差強人意。所以想借這個機會弄一下。
在記錄一條數據(Record)的時候,我本來使用了 List 實例化成 ArrayList,然后開始算,不過借助 JProbe 看了一下,List.size() 和 List.get(i) 這兩個方法因為調用次數太多而占用了大部分的時間,所以第一想法是改成數組。
當我 new Record 的時候,使用的是 list ,自然想把這個 List<T> 轉換成數組 T[] ,不過非常麻煩的是 list.toArray(T[]) 中的 T[] 不知道如何得到,不知道如何弄到 T[] 的實例,new T[list.size()] 是沒辦法的。
第一個反應是從 list 或是 List<T> 定義的 class 中得到成員的類型,然后使用 Arrays.newInstance 來創建一個,我花了好長的時間都沒有能夠得到,后來和同事聊天時,猜測是不是編譯完的 class 文件中根本就沒有類型的信息,不過當時沒能確定。
晚上接著猜數字的時候,舊事重提,google 了一下,看到了一個非常好的文章。
http://www.ibm.com/developerworks/cn/java/j-jtp01255.html將泛型說明的非常清楚,其中一句是這樣的“Java 語言中的泛型基本上完全在編譯器中實現,由編譯器執行類型檢查和類型推斷,然后生成普通的非泛型的字節碼。這種實現技術稱為
擦除(erasure)(編譯器使用泛型類型信息保證類型安全,然后在生成字節碼之前將其清除)”。
驗證了我的想法,在 class 文件中,根本就沒有泛型的信息。
實際上,聲明一個泛型數據的方法是
T[] array = (T[])new Object[length];
這樣,問題解決,對 Java 泛型的理解增加了一些。
posted on 2007-08-08 00:39
哈哈的日子 閱讀(3906)
評論(3) 編輯 收藏 所屬分類:
Java