簡體   English   中英

將Java ArrayList <Custom Class>轉換為ArrayList <Object>

[英]Casting Java ArrayList<Custom Class> to ArrayList<Object>

我試圖給轉換ArrayListSomeClass一個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的目的是我創建了一個外部庫來處理通用ObjectArrayList

如果您能夠將函數的簽名更改為采用ArrayList<? extends Object> objects ArrayList<? extends Object> objectsArrayList<?> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM