Как конвертировать список <String>в список <Object> - PullRequest
39 голосов
/ 26 ноября 2010

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

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

Ответы [ 6 ]

77 голосов
/ 26 ноября 2010

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

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

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

17 голосов
/ 26 ноября 2010

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

List<Object> objectList = (List)stringList;

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

6 голосов
/ 03 апреля 2016

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

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

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

List<String> stringList = new ArrayList<String>();
List<Object> objectList = Arrays.asList(stringList.toArray());
1 голос
/ 26 ноября 2010
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, если список объектов является существующим списком.

0 голосов
/ 07 июля 2019

model.class

публичный класс Модель {

private List<String> stringList = new ArrayList<>();

public List<String> getStringList() {
    return stringList;
}

public void setStringList(List<String> stringList) {
    this.stringList = stringList;
}

}

MainActivity

открытый класс 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);

}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...