我想将List<String>
转换为List<Object>
。
现有的一个方法返回List<String>
,我想将其转换为List<Object>
。Java中是否有直接的方式,而不是通过逐个迭代元素进行转换?
将List<String>
作为参数传递给新的ArrayList<Object>
的构造函数。
List<Object> objectList = new ArrayList<Object>(stringList);
任何实现了类型扩展自 ArrayList
的 Collection
都可以作为构造函数的参数传递,例如 String
继承自 Object
。虽然构造函数需要一个 Collection
,但是 List
是 Collection
的子接口,因此可以直接使用 List<String>
。List<Object> objectList = (List)stringList;
添加@SuppressWarning以摆脱不良影响...
List<String>
,而另一个引用认为它是一个List<Object>
。如果你使用新引用添加非字符串对象,旧引用将无法访问它们,从而抛出ClassCastException
异常。 - Erick RobertsoncallUglyLegacyCode((List) strings)
。 - qben个人而言,尽管目前排名靠前的两个答案在某种程度上都是正确的,但我认为它们没有以一种优雅、可重用的方式解决问题,特别是如果您经常需要这样做。
假设您有一些旧的遗留代码/依赖关系,您无法以任何方式更改它(因此它至少会接受 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<Object>
,你可以简单地使用Collections.unmodifiableList
方法来包装你的列表。这是有效的,因为该静态方法对于包装列表的元素类型有一个合适的通配符类型? extends T
(其中T
是结果列表的类型)。
请注意,在大多数情况下,创建一个不可修改的视图是你应该做的,否则在原始列表中可能会添加与String
以外的其他类型的对象(原始列表只应包含String
)。
这相当低效,但至少你不必写太多代码~
List<String> stringList = new ArrayList<String>();
List<Object> objectList = Arrays.asList(stringList.toArray());
stringList.toArray()
之后会创建一个新的分配数组。 - OscarRyzList<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);
}
}
String
是一个Object
,那么为什么需要它呢? - khachikList<Object>
的函数。 - Riley Lark