2009-06-29 30 views
7
String[] a = c.toArray(new String[0]); 

第一:我需要在這裏輸入嗎? (我覺得我們應該寫出這樣(String[])c.toArray();但我已經看到了剛剛c.toArray()不使用類型轉換這是有效我們應該使用object.toArray()類型轉換嗎?

二:?也是爲什麼我們寫new String[0]

+0

取決於c的類型。 – gimel 2009-06-29 05:33:57

+0

注意:你也可以使用'c.toArray(new String [] {});' – 2009-06-29 14:46:25

回答

12

類型轉換通常只在您使用預泛型Java時才需要。如果你看一下文檔爲Collection.toArray(T[]),你會看到,它知道這是返回數組的類型是一樣的就這麼過去了陣列的類型,你可以寫:

List<String> list = new ArrayList<String>(); 
list.add("Foo"); 
String[] array = list.toArray(new String[0]); 

你傳遞在數組中告訴集合你想要的結果類型,它可能與集合中的類型不同。例如,如果您有List<OutputStream>,則可能需要將其轉換爲Object[]Stream[]ByteArrayOutputStream[] - 顯然後者僅在每個元素實際上爲 a ByteArrayOutputStream時才起作用。這也意味着如果你已經擁有了一個正確的類型和大小的數組,那麼內容可以被複制到那裏,而不是創建一個新的數組。

這個答案的一個版本是不準確的,順便說一句 - 如果你使用過載不帶任何參數,總是你回來的Object[]不能投:

List<String> list = new ArrayList<String>(); 
list.add("Foo"); 

// toArray doesn't know the type of array to create 
// due to type erasure 
Object[] array = list.toArray(); 

// This cast will fail at execution time 
String[] stringArray = (String[]) arrray; 

編輯:我剛剛注意到這一點也是在erdemoo的答覆中提到,但它不能傷害到這裏有它太:)

1
  1. 是你需要自垂頭喪氣?指定者的返回類型是Object []。

  2. 你需要通過(新的String [0])的,因爲該方法的參數需要知道它應該返回什麼類型的數組(字符串,日期等的陣列)在內部,所有列表元素實際上都是對象,因此列表不知道它所保存的元素的類型因此它不知道應該返回哪種數組,除非將它作爲參數提供。

+1

不錯,但我認爲我們需要在這裏上傳! – Johanna 2009-06-29 05:45:14

4

如果你正在使用list.toArray(),這將返回對象數組。 即使存儲在列表中的元素是字符串類型,投射到字符串數組也會拋出異常。

如果您使用list.toArray(Object [] a),它會將列表中的元素存儲到「a」數組中。如果列表中的元素是String並且給了String數組,那麼它會將元素存儲在String數組中,如果給定數組的大小不足以將元素存儲在列表中,則它將展開給定列表。

相關問題