ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Я намагався:
ArrayList<String> list2 = (String)list;
Але це дало мені помилку компіляції.
ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Я намагався:
ArrayList<String> list2 = (String)list;
Але це дало мені помилку компіляції.
Відповіді:
Оскільки це насправді не список рядків, найпростіший спосіб - перевести цикл на нього та самостійно перетворити кожен елемент у новий список рядків:
List<String> strings = list.stream()
.map(object -> Objects.toString(object, null))
.collect(Collectors.toList());
Або коли ви ще не на Java 8:
List<String> strings = new ArrayList<>(list.size());
for (Object object : list) {
strings.add(Objects.toString(object, null));
}
Або коли ви ще не на Java 7:
List<String> strings = new ArrayList<String>(list.size());
for (Object object : list) {
strings.add(object != null ? object.toString() : null);
}
Зверніть увагу, що ви повинні заявляти проти інтерфейсу ( java.util.List
у цьому випадку), а не щодо реалізації.
String.valueOf(object)
, ви не повинні робити object != null ? object.toString() : null
речі
"null"
замість буквального null
. Далі це залежить від вимог бізнесу, бажано це чи ні. Для мене це взагалі не було б прийнятним, оскільки воно вводить потенційно велику помилку.
"null"
зовсім не є null
. У null
Java є особливе значення. Немає сенсу примушувати це робити, if (item.equals("null"))
перевіряючи на це згодом.
Це не безпечно робити!
Уявіть, якби у вас було:
ArrayList<Object> list = new ArrayList<Object>();
list.add(new Employee("Jonh"));
list.add(new Car("BMW","M3"));
list.add(new Chocolate("Twix"));
Не було б сенсу перетворювати список цих Об’єктів на будь-який тип.
Object#toString()
перекрили метод. Однак перетворення всього типу з X у String для інших цілей, ніж людське представлення, насправді не має особливого сенсу.
Якщо ви хочете зробити це брудним способом, спробуйте це.
@SuppressWarnings("unchecked")
public ArrayList<String> convert(ArrayList<Object> a) {
return (ArrayList) a;
}
Перевага: тут ви економите час, не перебираючи на всі об’єкти.
Недолік: може утворити діру на нозі.
Ваш код ArrayList<String> list2 = (String)list;
не компілюється, оскільки list2
він не має типу String
. Але це не єдина проблема.
Використання Java 8 лямбда:
ArrayList<Object> obj = new ArrayList<>();
obj.add(1);
obj.add("Java");
obj.add(3.14);
ArrayList<String> list = new ArrayList<>();
obj.forEach((xx) -> list.add(String.valueOf(xx)));
За допомогою Java Generics бере список X і повертає список T, який розширює або реалізує X, солодкий!
// the cast is is actually checked via the method API
@SuppressWarnings("unchecked")
public static <T extends X, X> ArrayList<T> convertToClazz(ArrayList<X> from, Class<X> inClazz, Class<T> outClazz) {
ArrayList<T> to = new ArrayList<T>();
for (X data : from) {
to.add((T) data);
}
return to;
}