2010-11-26 2 views
30

Я хочу преобразовать List<String> в List<Object>.Как конвертировать список <String> в список <Object>

Один из существующих методов возвращает List<String>, и я хочу его преобразовать в List<Object>. Есть ли прямой способ в Java, а затем итерация и преобразование элемента по элементу?

+4

`String`` `Object` зачем он вам нужен? – khachik 2010-11-26 19:34:51

+4

Возможно, вам нужно будет передать список функции, которая ожидает «Список » – 2010-11-26 19:40:23

+8

Что именно вы пытаетесь сделать? Из-за стирания типа, список является списком . Если есть метод, который принимает список , этот метод следует изменить в List .Если вы не контролируете этот метод, следуйте приведенным ниже ответам. – 2010-11-26 19:46:29

ответ

57

Пропустите List<String> в качестве параметра конструктору нового ArrayList<Object>.

List<Object> objectList = new ArrayList<Object>(stringList); 

Любой Collection может быть передан в качестве аргумента в конструктор тех пор, пока его тип расширяет тип ArrayList, а String расширяет Object. Конструктор принимает значение Collection, но List является дополнительным элементом Collection, поэтому вы можете просто использовать List<String>.

3

Это довольно неэффективно, но, по крайней мере, вам не придется писать много кода ~

List<String> stringList = new ArrayList<String>(); 
List<Object> objectList = Arrays.asList(stringList.toArray()); 
13

Любая коллекция java - это просто коллекция объектов, будь то строка или другое. Аргумент типа - это просто сахар. В зависимости от ситуации, например, имея дело с очень большими списками, вы можете просто ее конвертировать - очевидно, рискуя смешать два разных типа объектов в одном списке.

List<Object> objectList = (List)stringList; 

И поставил @SuppressWarning, чтобы избавиться от гадости ...

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

Лично, в то время как оба в настоящее время отвечают самым высоким требованиям, я не думаю, что любой из них решает проблему элегантным, многоразовым способом, особенно если вам нужно делать это очень часто.

Предположим, у вас есть какой-то старый унаследованный код/​​зависимость, что вы не можете изменить каким-либо образом (так что, по крайней мере, принять 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 
    } 
} 
Смежные вопросы