2014-01-23 48 views
5

Collection類是2 toArray()方法:<T> T[] toArray(T[] a)Object[] toArray()。沒有E[] toArray()方法。爲什麼? 它與類型擦除相關,但有例如方法 - boolean add(E e)。爲什麼可以創建參數化的add,並且不可能創建toArray()方法?toArray()方法Collection類中的

+0

對反引號很滿意嗎? – csmckelvey

+0

你能解釋一下嗎?反撥有什麼問題:p? – Pawel

+0

沒什麼錯,我只是給你一個難過的時間:)在這麼小的空間裏看到這麼多東西真是難得。 – csmckelvey

回答

11

沒有E [] toArray()方法。爲什麼?

有沒有辦法,它可以實際上創建E[]在執行時,因爲它不知道陣列創建,由於類型擦除類型。

add方法真的接受任何東西,但是編譯器只檢查參數類型與E第一兼容。執行時不需要知道什麼。同樣,對於像List.get,編譯器插入一個撒入調用代碼:

List<String> strings = new ArrayList<>(); 
strings.add("hello"); 
String first = strings.get(0); 

被編譯成相同的代碼,因爲這預泛型代碼:

List strings = new ArrayList(); 
strings.add("hello"); 
String first = (String) strings.get(0); 

現在,這是在這裏很好,因爲我們知道String類型在調用代碼中的執行時間......但在toArray()中,創建數組的代碼需要知道類型......並且類型擦除意味着它實際上不知道該類型。傳入toArray()的數組允許它創建一個相同類型的數組。事實上,實際類型創建的對象可以表現取決於你在通過陣列上:

import java.util.*; 

public class Test { 

    public static void main(String[] args) { 
     List<Object> objects = new ArrayList<Object>(); 
     objects.add("xyz"); 

     Object[] array1 = objects.toArray(new String[0]); 
     Object[] array2 = objects.toArray(new Object[0]); 
     System.out.println(array1.getClass()); // class [Ljava.lang.String; 
     System.out.println(array2.getClass()); // class [Ljava.lang.Object; 
    } 
} 

如果我們new Integer[0]會通過,將有編譯,但後來我們不得不當toArray試圖將String(唯一元素)投射到Integer時,獲得ClassCastException

+0

我正確嗎?很快:'add'方法可以通過編譯器檢查,所以可以有參數化類型。 'toArray'方法也可以由編譯器進行檢查,但它什麼也不給,因爲由於類型擦除返回的類型將始終是Object的數組?它可以創建,但它是沒用的。參數化類型在'add'方法中,因爲編譯器可以檢查參數並且它是有用的。 – Pawel

+0

@Pawel:排序。這真的與可以檢查的內容有關,*當*時。我不*很確定我完全按照你的想法,但希望他們符合答案:) –

相關問題