[英]Casting Java ArrayList<Custom Class> to ArrayList<Object>
我試圖給轉換ArrayList
類SomeClass
一個ArrayList
類的Object
。 然后,這個新的Object
ArrayList
將傳遞給一個函數。 我目前做了以下事情:
// convert ArrayList<SomeClass> to generic ArrayList<Object>
Object[] objectArray = someClassList.toArray();
ArrayList<Object> objects = new ArrayList<Object>();
for (int i = 0; i < objectArray.length; i++) {
objects.add(objectArray[i]);
}
someFunction(objects);
public void someFunction(ArrayList<Object> objects) {
// do something with objects
}
這樣做有更高效或“標准”的方式嗎? 我首先做的是“錯誤”嗎?
將它轉換為Object
類的ArrayList
的目的是我創建了一個外部庫來處理通用Object
的ArrayList
。
如果您能夠將函數的簽名更改為采用ArrayList<? extends Object> objects
ArrayList<? extends Object> objects
或ArrayList<?> objects
(甚至更好, List
而不是ArrayList
),您將能夠直接傳遞ArrayList<SomeClass>
。
ArrayList<SomeClass>
不是 ArrayList<Object>
是ArrayList<Object>
會接受你在其中add()
任何類型的Object
,這不是你可以用ArrayList<SomeClass>
做的事情。 另一方面, ArrayList<? extends Object>
ArrayList<? extends Object>
允許您從列表中檢索元素,但不能添加元素,因此可以安全地為其分配ArrayList<SomeClass>
。
由於您創建了外部庫,我認為修改函數簽名以接受任何類型的列表會更容易。 這可以使用無界通配符來完成?
:
public static void someFunction(List<?> objects) {
// whatever
}
然后,您無需進行任何轉換即可調用它:
public static void main(String[] args) {
List<String> words = new ArrayList<>();
someFunction(words);
}
另外,除非你有充分的理由不這樣做,否則最好接受someFunction
任何List
,而不是將輸入限制為ArrayList
。 這使您的代碼在未來更靈活,更易於更改。
可以使用兩個強制轉換以任意方式轉換類型的類型參數:
ArrayList<SomeClass> l1 = ...;
ArrayList<Object> l2 = (ArrayList<Object>) (Object) l1;
但是,正如Aasmund Eldhuset在他的回答中所說: 這可能不是一個好主意! 最好給l2
一個更合適的類型,比如ArrayList<?>
。
此代碼為您提供編譯警告,說明Type safetyThat: Unchecked cast from Object to ArrayList<Object>
的原因。 例如,如果將一個String
添加到l2
,然后有人讀取l1
並期望SomeClass
,則會得到一個非常意外的ClassCastException
。
將List<SubFoo>
轉換為List<Foo>
一種簡單方法是使用Collections.unmodifiableList(listOfSubFoos)
,這是完全類型安全的,並且實際上強制你不能做任何不好的事情(比如添加一個DifferentSubFoo
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.