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> strList = (ArrayList<String>)(ArrayList<?>)(list);
Ваш код 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, Sweet!
// 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;
}