[英]How to Convert List<String> to List<Object>
我想將List<String>
轉換為List<Object>
。
現有方法之一是返回List<String>
,我想將其轉換為List<Object>
。 除了逐個元素迭代和轉換之外,Java 中還有直接的方法嗎?
將List<String>
作為參數傳遞給 new ArrayList<Object>
的構造函數。
List<Object> objectList = new ArrayList<Object>(stringList);
任何Collection
都可以作為參數傳遞給構造函數,只要它的類型擴展ArrayList
的類型,就像String
擴展Object
。 構造函數采用Collection
,但List
是Collection
的子接口,因此您可以只使用List<String>
。
任何 java 集合都只是對象的集合,無論是字符串還是其他。 類型參數只是糖。 根據情況,例如處理非常大的列表,您可能只想轉換它 - 顯然冒着在同一個列表中混合兩種不同類型的對象的風險。
List<Object> objectList = (List)stringList;
並放一個@SuppressWarning 來擺脫討厭的東西......
就個人而言,雖然目前評價最高的兩個答案在某種程度上都是正確的,但我認為它們中的任何一個都無法以優雅、可重用的方式解決問題,尤其是在您必須經常這樣做的情況下。
假設您有一些舊的遺留代碼/依賴項,您無法以任何方式更改(這樣它至少會接受List<? extends Object>
正如@ReverendGonzo 在他的評論中所建議的那樣。還假設您需要與這個遺留模塊交談很多。
我認為從長遠來看,無論是鑄造還是復制都是可以忍受的。 它使您的代碼容易受到潛在錯誤的影響並且難以遵循,或者略微(或嚴重)低效且難以閱讀。
為了擁有可讀和高效的生產代碼,最好將臟部分封裝在一個單獨的模塊中,該模塊處理其他無害但丑陋的演員。
class ProductionCode {
public void doJob() {
List<String> strings = Arrays.asList("pear", "apple", "peach");
StringMagicUtils.dealWithStrings(strings);
}
}
class StringMagicUtils {
@SuppressWarnings("unchecked")
public static void dealWithStrings(List<String> strings) {
ExternalStringMagic.dealWithStringsAsObjects((List) strings);
}
}
// Legacy - cannot edit this wonderful code below ˇˇ
class ExternalStringMagic {
public static void dealWithStringsAsObjects(List<Object> stringsAsObjects) {
// deal with them as they please
}
}
這樣效率很低,但至少不用寫很多代碼了~
List<String> stringList = new ArrayList<String>();
List<Object> objectList = Arrays.asList(stringList.toArray());
如果您願意轉換為不可修改的List<Object>
,您可以簡單地用Collections.unmodifiableList
包裝您的列表。 這是有效的,因為這個靜態方法有一個正確的通配符類型? extends T
為包裝列表的元素類型? extends T
(其中T
是結果列表的類型)。
請注意,在大多數情況下,您應該做的是創建一個不可修改的視圖,否則可能會在原始列表中添加不同類型的對象(除了String
)(應該只包含String
)。
List<Object> ofObjects = new ArrayList<Object>(ofStrings);
如:
import java.util.*;
class C {
public static void main( String[] args ) {
List<String> s = new ArrayList<String>();
s.add("S");
List<Object> o = new ArrayList<Object>(s);
o.add( new Object() );
System.out.println( o );
}
}
作為替代方案,如果對象列表是現有列表,您可以嘗試addAll
方法。
公共類模型{
private List<String> stringList = new ArrayList<>();
public List<String> getStringList() {
return stringList;
}
public void setStringList(List<String> stringList) {
this.stringList = stringList;
}
公共類 MainActivity 擴展 AppCompatActivity {
Model model = new Model();
Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner=findViewById(R.id.spinner);
List<String> itemList = new ArrayList<String>();
itemList.add("item1");
itemList.add("item2");
itemList.add("item3");
model.setStringList(itemList);
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, model.getStringList());
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(dataAdapter);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.