我發現下面的代碼在Java中顯着:Java泛型,從C++模板來
ArrayList<String> l1 = new ArrayList<String>();
ArrayList<Integer> l2 = new ArrayList<Integer>();
System.out.println(l1.getClass() == l2.getClass()); // true
System.out.println(l2.getClass().isAssignableFrom(l1.getClass())); // true too
//ArrayList<Integer> l3 = l1; // won't compile though
我不太明白的「isAssignableFrom」的細節。當然,我希望編譯器停止l3 = l2,但是它似乎與前一行相矛盾? (我確信這裏有微妙的一點,這就是我所追求的:-)
具體而言,這被稱爲*類型擦除*。關於泛型的Java教程很好的解釋了Java泛型的缺陷:http://download.oracle.com/javase/tutorial/java/generics/erasure.html – Scott
是的,它感覺有點矛盾,因爲某些東西在運行時是正確的,但不是在編譯時,或者它是可分配的,但不能分配。它感覺不太對勁:-) – Frank
@Frank我認爲依賴運行時正確性的思路是糟糕的設計;相反,我們應該設計我們的代碼,以便在編譯時捕獲錯誤。這並不是說我們總是成功:) – corsiKa