我想转换List<String>为List<Object>.
现有方法之一是返回List<String>,我想将其转换为List<Object>.在Java中是否存在直接的方式,然后迭代并逐个元素地转换?
Eri*_*son 79
将List<String>作为参数传递给new的构造函数ArrayList<Object>.
List<Object> objectList = new ArrayList<Object>(stringList);
Run Code Online (Sandbox Code Playgroud)
任何Collection都可以作为参数传递给构造函数,只要它的类型扩展了类型ArrayList,作为Stringextends Object.构造函数采用a Collection,但是List是子接口Collection,所以你可以使用List<String>.
Mar*_*ten 19
任何java集合只是字符串或其他对象的集合.类型参数只是糖.根据情况,例如处理非常大的列表,您可能只想转换它 - 显然有可能在同一列表中混合两种不同类型的对象.
List<Object> objectList = (List)stringList;
Run Code Online (Sandbox Code Playgroud)
并放一个@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
}
}
Run Code Online (Sandbox Code Playgroud)
如果您愿意转换为不可修改的List<Object>,您可以简单地用 包裹您的列表Collections.unmodifiableList。? extends T这是有效的,因为此静态方法对于包装列表的元素类型(其中T是结果列表的类型)具有正确的通配符类型。
请注意,在大多数情况下,您应该做的是创建一个不可修改的视图,否则不同类型的对象(除 之外String)可能会添加到原始列表(应该只包含Strings)中。