2014-12-01 45 views
0

A Vector可能包含不同類型的對象。調用toArray()方法是否會返回一個Object[]數組或一組特定對象(例如,Integer,Double)?我猜它不返回特定的對象數組,因爲數組只能有一種類型的對象。Vector <>類的數組()方法

有沒有什麼方法根據Vector中包含的對象類型創建多個對象特定數組?

+2

您實際上希望'Vector'只包含您的參數化類型(例如'Vector ')。 [Vector上的Javadoc](https://docs.oracle.com/javase/7/docs/api/java/util/Vector.html#toArray())也將滿足您對'toArray'的關注。 – Makoto 2014-12-01 18:52:47

+0

當差異*重要*時,對不同類型的元素使用'Vector'可能表示設計不好。一個向量通常應該是你想要批量處理的類似事物的列表。如果你將它用作「一堆奇怪的東西」,你應該重新考慮你的設計。 – RealSkeptic 2014-12-01 19:00:39

+1

雖然我同意它可能不是最好的設計,但我想指出,即使編譯器不知道它,Vector仍包含特定的元素。它只是*,編譯器不能保證你那裏所有的東西。你失去了靜態編譯檢查(這是你不應該輕易扔掉的東西),但它仍然有效。 – tilois 2014-12-01 19:32:29

回答

5

兩個Vector和任何Collection對象有2種方法:toArray()返回Object[]和你必須提供正確類型的數組toArray(T[])

如果你有Integer集合這將工作:

Vector<Integer> vector = ... 
Integer[] myInts = vector.toArray(new Integer[vector.size()]); 

注意,我創建的矢量大小的數組。這實際上並不是必需的,但會加快速度,否則Java將不得不使用反射來確定類型並創建一個正確大小的數組。

如果您收藏有不同incompatiable類型的混合,以及您提供不能用來存儲所有這些數組,JVM將拋出一個java.lang.ArrayStoreException運行當你調用toArray(array[])

Vector<Object> vector = new Vector<>(); 
    vector.add(Integer.valueOf(2)); 
    vector.add(Double.valueOf(3.14)); 

    vector.toArray(new Integer[vector.size()]); //<-- throws ArrayStoreException 

但是,使用向量中的所有對象都可以兼容的對象數組是可以的。

這工作,因爲這兩個IntegerDouble延長Number

Number[] myNumbers = vector.toArray(new Number[vector.size()]); 
+0

如果我指定toArray(Integer [])並且我的向量包含Integer和Double類型的對象,會發生什麼?編譯器會在編譯期間還是在運行期間捕獲這個錯誤? – user3182445 2014-12-02 04:13:08

+0

@ user3182445更新了答案 – dkatzel 2014-12-02 15:04:54

1

因爲你只能從該方法返回1個對象,要做到這一點的方法是創建一個ManyMap,索引每個對象的Class與該類別的對象列表/數組