ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Lo intenté:
ArrayList<String> list2 = (String)list;
Pero me dio un error de compilación.
ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Lo intenté:
ArrayList<String> list2 = (String)list;
Pero me dio un error de compilación.
Respuestas:
Dado que en realidad no es una lista de cadenas, la forma más sencilla es recorrerla y convertir cada elemento en una nueva lista de cadenas usted mismo:
List<String> strings = list.stream()
.map(object -> Objects.toString(object, null))
.collect(Collectors.toList());
O cuando aún no estás en Java 8:
List<String> strings = new ArrayList<>(list.size());
for (Object object : list) {
strings.add(Objects.toString(object, null));
}
O cuando aún no estás en Java 7:
List<String> strings = new ArrayList<String>(list.size());
for (Object object : list) {
strings.add(object != null ? object.toString() : null);
}
Tenga en cuenta que debe declarar contra la interfaz ( java.util.List
en este caso), no la implementación.
String.valueOf(object)
, no tendrá que hacer object != null ? object.toString() : null
nada
"null"
lugar del literal null
. Depende además de las recompensas comerciales si eso es deseable o no. Para mí, no habría sido aceptable en absoluto, ya que introduce un error potencialmente importante.
"null"
no lo es null
en absoluto. El null
tiene un significado especial en Java. No tiene sentido verse obligado a hacerlo if (item.equals("null"))
cuando se verifica eso después.
¡No es seguro hacer eso!
Imagínese si tuviera:
ArrayList<Object> list = new ArrayList<Object>();
list.add(new Employee("Jonh"));
list.add(new Car("BMW","M3"));
list.add(new Chocolate("Twix"));
No tendría sentido convertir la lista de esos Objetos a ningún tipo.
Object#toString()
método anulado. Sin embargo, la conversión completa de tipos de X a String para otros fines que no sean la presentación humana no tiene mucho sentido.
Si quieres hacerlo de la manera sucia, prueba esto.
@SuppressWarnings("unchecked")
public ArrayList<String> convert(ArrayList<Object> a) {
return (ArrayList) a;
}
Ventaja: aquí se ahorra tiempo al no iterar sobre todos los objetos.
Desventaja: puede producir un agujero en su pie.
Puede usar comodines para hacer esto de la siguiente manera
ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);
Su código ArrayList<String> list2 = (String)list;
no se compila porque list2
no es de tipo String
. Pero ese no es el único problema.
Usando Java 8 lambda:
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)));
Con Java Generics Toma una lista de X y devuelve una lista de T que extiende o implementa X, ¡Dulce!
// 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;
}