Java泛型的擦除特性小記

ArrayList<A> arrayList = new ArrayList<>();
arrayList.add(new A());

ArrayList arrayList2 = arrayList;

ArrayList<B> arrayList3 = arrayList2;
arrayList3.add(new B());

上面這段代碼會向同一個ArrayList中添加兩種不一樣的類型(A,B沒有任何關係,是徹底獨立的兩個類)。你也許會說正常沒人這麼寫代碼,但真正的代碼可能會和他差別很大,最終出現問題的緣由卻和這裏一致。code

因爲擦除的存在,若是你能夠拿到ArrayList的泛型信息,arrayList,arrayList2,arrayList3會給你不一樣的答案。下面再舉一個例子:對象

ArrayList arrayList = new ArrayList<Integer>();

上面這段代碼,若是你獲取到arrayList的泛型,你會發現,它不是Integer。泛型

小結

因爲「擦除」的存在,泛型類不存在向上轉型,向下轉型。特別的,當你「向上轉型」到通用類型(如ArrayList<Integer> -> ArrayList)時,泛型會丟失,此時你會失去ArrayList中存儲數據的類型的信息(此時ArrayList會丟失全部基於泛型的特性,它看起來就是一個沒有泛型的ArrayList)。此時你能夠「向下轉型」到任何類型。List

泛型只和聲明點有關,沒有實際類型一說。(普通的對象,當它被new出來,它的實際類型是肯定的,不管你怎麼轉型,它本質上就是new時的類型,但泛型對象不是,泛型對象的泛型永遠和聲明點同類型,而不在意new時的類型)數據

相關文章
相關標籤/搜索