——— 獻給那些直到現在仍在孜孜不倦創造下一代計算機語言的人們!
在學習《Thinking in java》書中總能獲得一些收穫,紙質版第四版中關於java泛型寫了大概幾百頁,內容豐富至極,詳細分析了泛型在內存堆棧還有和C++的對比,感謝原書作者Bruce Eckel帶給我那麼多驚喜。
接下來我我總結了一些關於書中泛型的經典代碼。(本人win10操作系統,jdk1.8 64位版本)
Class<?> class1 = new ArrayList<String>().getClass();
Class<?> class2 = new ArrayList<Integer>().getClass();
System.out.println(class1==class2);
輸出結果true
這裏jvm採用了擦除機制,內部認為就是集合,擦除了集合的具體類型。
另外Class<\?>和Class<\Object>是有區別的,前者是一個泛化的類型,不確定是什麼,可能是集合,可能是數組,也可能是複雜類型。後者是一個Object類型。(“\”為編輯時候轉義,否則看不見內容)
public class TestJavaClass {
public static void main(String[] args) {
fun(new ArrayList<>());
System.out.println(1);
}
public static void fun(List<? extends TestJavaClass> list){
}
public static void fun(List<? super TestJavaClass> list){
}
}
輸出結果是1
按照重載的定義,fun方法構成重載是有衝突的,因為有邊界類TestJavaClass,上面屬於子類類型,下面屬於父類類型。其實這樣理解應該是不對的。泛型中泛化了,都屬於集合類型的。不構成重載。雖然編譯報錯,但是仍舊可以運行得出結果,會選擇上面的代碼執行。哪個放上面都可以。
class A<T extends Object & Serializable & Set & List>{
}
這段代碼的意思是T必須繼承Object並且實現Serializable,Set , List接口。這樣寫好處很多。比如需要繼承某個類,並且都需要可序列化。
class Tuple<T,D,F,M,P>{
}
public Tuple<String,List<String>,Object,Map<String,String>,Integer> test(){
return null;
}
泛型可以容納很多類型,也可以叫元組。一次返回很多類型的元組。
class N<T extends N<T>>{
}
上面這種寫法看起來有些特殊,無限泛型。但是依舊可以這些寫。