如何将List <string>转换为List <object> </object> </string>

时间:2010-11-26 19:32:44

标签: java generics

我想将List<String>转换为List<Object>

现有方法之一是返回List<String>,我想将其转换为List<Object>。 在Java中是否存在直接的方式,然后迭代并逐个元素地转换?

7 个答案:

答案 0 :(得分:75)

List<String>作为参数传递给新ArrayList<Object>的构造函数。

List<Object> objectList = new ArrayList<Object>(stringList);

任何Collection都可以作为参数传递给构造函数,只要其类型扩展ArrayList的类型,String扩展Object。构造函数采用Collection,但ListCollection的子接口,因此您只需使用List<String>

答案 1 :(得分:17)

任何java集合只是字符串或其他对象的集合。类型参数只是糖。根据情况,例如处理非常大的列表,您可能只想转换它 - 显然有可能在同一列表中混合两种不同类型的对象。

List<Object> objectList = (List)stringList;

并放一个@SuppressWarning来摆脱恶意......

答案 2 :(得分:6)

就个人而言,虽然目前评价最高的两个答案都是正确的,但我认为它们中的任何一个都不会以优雅,可重复的方式解决问题,特别是如果你必须经常这样做的话。

假设您有一些旧的遗留代码/依赖项,您无法以任何方式进行更改(因此它至少会接受List<? extends Object>,因为@ReverendGonzo建议in his comment。还假设您需要说话这个遗留模块很多。

我不认为从长远来看,无论是一直投射/复制都是可以忍受的。它会使您的代码容易受到潜在的漏洞攻击,并且难以遵循或略微(或极其)低效且难以阅读。

为了拥有可读且高效的生产代码,最好将脏部分封装在一个单独的模块中,该模块处理其他无害但丑陋的演员。

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
    }
}

答案 3 :(得分:3)

这是非常低效的,但至少你不必写很多代码〜

List<String> stringList = new ArrayList<String>();
List<Object> objectList = Arrays.asList(stringList.toArray());

答案 4 :(得分:1)

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方法。

答案 5 :(得分:0)

model.class

公共类模型{

private List<String> stringList = new ArrayList<>();

public List<String> getStringList() {
    return stringList;
}

public void setStringList(List<String> stringList) {
    this.stringList = stringList;
}

}

MainActivity

公共类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);

}

}

答案 6 :(得分:0)

如果您愿意转换为不可修改的List<Object>,则只需用Collections.unmodifiableList包装列表即可。之所以可行,是因为此静态方法对于包装列表的元素类型(其中? extends T是结果列表的类型)具有适当的通配符类型T

请注意,在大多数情况下,应该执行创建不可修改的视图的操作,否则,可能会将不同类型(String除外)的对象添加到原始列表中(应该只容纳String个。)