繁体   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