如何将List <String>转换为List <Object>

Ale*_*exs 42 java generics

我想转换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>.

  • 我今天刚刚破解了一个内存占用量增加到 90+ 百万个元素的列表,只是引用,在一个线程中分配了总共 1.3GB(我有 4-5 个这些线程)。诚然,这是一个错误,但在正常情况下,该列表最多为 570 万,仍然很重要。这归结为形势和务实的选择。铸造不是一个空白不不。 (3认同)
  • 这构造了不必要的对象,如果这是一个大的列表,可能会占用大量内存.只是施展它. (2认同)
  • 阅读我对你的回答的评论。铸造它是错误的解决方案。这个答案不值得一票否决。 (2认同)

Mar*_*ten 19

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

List<Object> objectList = (List)stringList;
Run Code Online (Sandbox Code Playgroud)

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

  • 然后,您将有两个对同一对象的引用.一个引用认为它是一个`List <String>`而另一个认为它是一个`List <Object>`.如果使用不是字符串的新引用添加对象,则旧引用将无法在不抛出"ClassCastException"的情况下访问它们. (5认同)
  • 它真的不是.当你已经得到你需要的东西时,为什么要建造新的收藏?这是理性和有效的. (4认同)
  • 是的,你可以明显滑倒,混合苹果和梨,但根据情况,这可能正是所需要的.例如,如果这是一个方法的本地列表而没有暴露,我会毫不犹豫地这样做.这是一个务实的选择. (2认同)
  • 好的,我已经澄清你需要知道你在做什么。 (2认同)

qbe*_*ben 6

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

假设您有一些旧的遗留代码/依赖项,您无法以任何方式进行更改(因此它至少会接受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)


Mic*_*kis 5

如果您愿意转换为不可修改的List<Object>,您可以简单地用 包裹您的列表Collections.unmodifiableList? extends T这是有效的,因为此静态方法对于包装列表的元素类型(其中T是结果列表的类型)具有正确的通配符类型。

请注意,在大多数情况下,您应该做的是创建一个不可修改的视图,否则不同类型的对象(除 之外String)可能会添加到原始列表(应该只包含Strings)中。