我想将List<String>
转换为List<Object>
。
现有方法之一是返回List<String>
,我想将其转换为List<Object>
。
在Java中是否存在直接的方式,然后迭代并逐个元素地转换?
答案 0 :(得分:75)
将List<String>
作为参数传递给新ArrayList<Object>
的构造函数。
List<Object> objectList = new ArrayList<Object>(stringList);
任何Collection
都可以作为参数传递给构造函数,只要其类型扩展ArrayList
的类型,String
扩展Object
。构造函数采用Collection
,但List
是Collection
的子接口,因此您只需使用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)
公共类模型{
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);
}
}
答案 6 :(得分:0)
如果您愿意转换为不可修改的List<Object>
,则只需用Collections.unmodifiableList
包装列表即可。之所以可行,是因为此静态方法对于包装列表的元素类型(其中? extends T
是结果列表的类型)具有适当的通配符类型T
。
请注意,在大多数情况下,应该执行创建不可修改的视图的操作,否则,可能会将不同类型(String
除外)的对象添加到原始列表中(应该只容纳String
个。)