Я хочу преобразовать List<String>
в List<Object>
.
Один из существующих методов возвращает List<String>
, и я хочу преобразовать его в List<Object>
.
Есть ли прямой путь в Java, а затем итерация и преобразование элемента по элементу?
Я хочу преобразовать List<String>
в List<Object>
.
Один из существующих методов возвращает List<String>
, и я хочу преобразовать его в List<Object>
.
Есть ли прямой путь в Java, а затем итерация и преобразование элемента по элементу?
Передайте List<String>
в качестве параметра конструктору нового ArrayList<Object>
.
List<Object> objectList = new ArrayList<Object>(stringList);
Любой Collection
может быть передан как аргумент конструктору, пока его тип расширяет тип ArrayList
, так как String
extends Object
. Конструктор принимает значение Collection
, но List
является подпоследователем Collection
, поэтому вы можете просто использовать List<String>
.
Любая коллекция java - это просто набор объектов, будь то строка или другая. Аргумент типа - это просто сахар. В зависимости от ситуации, например, имея дело с очень большими списками, вы можете просто ее преобразовать - очевидно, рискуя смешивать два разных типа объектов в одном списке.
List<Object> objectList = (List)stringList;
И поставьте @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
}
}
Это довольно неэффективно, но по крайней мере вам не нужно писать много кода ~
List<String> stringList = new ArrayList<String>();
List<Object> objectList = Arrays.asList(stringList.toArray());
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
, если список объектов - это существующий список.
публичный класс Model {
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);
}
}