簡體   English   中英

如何轉換列表<String>列出<Object>

[英]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 ,但ListCollection的子接口,因此您可以只使用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方法。

模型.class

公共類模型{

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.

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