發表文章

目前顯示的是 7月, 2008的文章

Java:建立有泛型的Collection陣列

最近遇到的問題,想將JMenuItem分成三類,每個類別要能動態增減,不過減得機率很少,所以建立了ArrayList帶有泛型的Collection陣列,不過卻不能直接的建立,該如何解決!? 關鍵詞: create array of java generic collection import java.util.ArrayList; import javax.swing.JMenuItem; /** 建立如何建立包函泛型的Collection陣列。 */ class ArrayOfGenericCollection { public static void main(String [] args) { // 最直覺的寫法,不過這個寫法是無法通過編譯的。 //ArrayList<JMenuItem> gat[] = new ArrayList<JMenuItem>[10]; // 下面的寫法是利用Java陣列的基本概念,加上轉型, // 不過因為動態轉型所以編譯帶有警告。 // 且執行時期因為Object無法轉成ArrayList,所以這樣也行不通。 //ArrayList<JMenuItem> gat2[] = (ArrayList<JMenuItem>[])new Object[10]; // 上面的寫法,既然無法將Object轉成ArrayList, // 那我們就建立一個不帶泛型標記的ArrayList // (有標記的就是一開始的寫法) // 編譯加執行成功!! ArrayList<JMenuItem> gat3[] = (ArrayList<JMenuItem>[])new ArrayList[10]; for (int i=gat3.length-1; i>=0; --i) gat3[i] = new ArrayList<JMenuItem>(5); System.out.println("gat3[1].size()="+gat3[1].size()); // 轉型少了泛型也是可以的,因為隱含轉型也合法。 // 同樣的,編譯加執行成功!! ArrayList

宣告與初始化陣列成員與類別成員

先前資訊安全的作業Java的AES程式,想改為想使用BCB改為C++版實作,在改變實作語言時遇到小trouble,我有下面一個只擁有常數資料的類別: public class AESTables {  public static final byte[] Sbox = {   (byte)0x63 ,(byte)0x7c ,(byte)0x77 ,(byte)0x7b ...  }  ... } 而直接的想法是下面這個樣子,我認為這樣應該就OK了(嘆) class AESTables {  public:  static const unsigned char Sbox[] = {   0x63 ,0x7c ,0x77 ,0x7b ...  }  ... } 結果是沒有辦法compile,我try'n'error許久,最後的結論是只有下面這樣才能compile。 class ts {  public:  const static int a = 10;  const static int b[]; }; 但是這樣只能宣告成功,卻沒辦法使用它,一使用就會產生LinkError。而想要利用default constructor初始化陣列,compiler則是會給予const存取拒絕或認定為不正常的語法。 最後在 Google 上找到 解決方案 了,不過老實說,這方法沒有寫過還真不知道它存在。 class ts {  public:  const static int a = 10;  const static int b[]; const static ClassC c; }; const int ts::b[] = {1, 1, 1, -10, -1}; const ClassC ts::c = ClassC(); const ClassC ts::c(); //簡寫 使用關鍵字: C++ static class member array initialization 2007-10-01 備註 今天在以前買的 參考書 中也看到相同寫法了,由此可見以前都沒學好(汗)。

Java Puzzlers: 22. Dupe of URL

這隻程式會做什麼事情? public class BroswerTest { public static void main(String[] args) { System.out.println("iexplore"); http://www.google.com.tw System.out.println(":maximize"); } } 看出來了嗎? 其實它只會印字而已。 讓我們排版一下,這樣應該就瞭解了 public class BroswerTest { public static void main(String[] args) { System.out.println("iexplore"); http: //www.google.com.tw System.out.println(":maximize"); } } http: 是個label,在Java中也是有Label,是用在loop跳出時指定用的。 而// 則是整行註解,把後面的東西都註解掉了,所以這個URL可以編譯其實只是個假象。 上一篇Puzzlers: Java Puzzlers: 38.The Unwelcome Guest