爲什麼這個代碼編譯:爲什麼ArrayList的<E>構造允許原始的ArrayList參數
ArrayList strings = new ArrayList();
strings.add("s1");
strings.add("s2");
ArrayList<Integer> numbers = new ArrayList<Integer>(strings);
鑑於所涉及的構造函數需要一個Collection<? extends E>
其中E
在這種情況下是整型?如何將原始類型ArrayList
中的對象包含在E
的子類中?或者是否有一些隱藏的編譯器魔術可以實現這一目的?
我想這是因爲兼容性。由於編譯器無法知道哪些對象在「字符串」中,因此它假定其中存在正確的對象。 如果編譯器的行爲不同(並且不允許這樣做),那麼從(舊)非泛型使用代碼到泛型的改變幾乎是不可能的。 –
這只是衆所周知的原始類型轉換的一個實例:'列表 numbers = new ArrayList();'。 –