ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Eu tentei:
ArrayList<String> list2 = (String)list;
Mas me deu um erro de compilação.
ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Eu tentei:
ArrayList<String> list2 = (String)list;
Mas me deu um erro de compilação.
Respostas:
Uma vez que este é , na verdade, não é uma lista de strings, a maneira mais fácil é fazer um loop sobre ele e converter cada item em uma nova lista de seqüências de si mesmo:
List<String> strings = list.stream()
.map(object -> Objects.toString(object, null))
.collect(Collectors.toList());
Ou quando você ainda não está no Java 8:
List<String> strings = new ArrayList<>(list.size());
for (Object object : list) {
strings.add(Objects.toString(object, null));
}
Ou quando você ainda não está no Java 7:
List<String> strings = new ArrayList<String>(list.size());
for (Object object : list) {
strings.add(object != null ? object.toString() : null);
}
Observe que você deve declarar em relação à interface ( java.util.List
neste caso), não à implementação.
String.valueOf(object)
, você não terá que fazer a object != null ? object.toString() : null
coisa
"null"
vez do literal null
. Depende ainda das exigências de negócios se isso é desejável ou não. Para mim, não teria sido aceitável, já que introduz um bug potencialmente importante.
"null"
não é null
. O null
tem um significado especial em Java. Não faz sentido ser forçado a fazer isso if (item.equals("null"))
ao verificar isso posteriormente.
Não é seguro fazer isso!
Imagine se você tivesse:
ArrayList<Object> list = new ArrayList<Object>();
list.add(new Employee("Jonh"));
list.add(new Car("BMW","M3"));
list.add(new Chocolate("Twix"));
Não faria sentido converter a lista desses objetos em qualquer tipo.
Object#toString()
método substituído. No entanto, toda a conversão de tipo de X em String para outros fins que não a apresentação humana realmente não faz muito sentido.
Se você quiser fazer da maneira suja, tente fazer isso.
@SuppressWarnings("unchecked")
public ArrayList<String> convert(ArrayList<Object> a) {
return (ArrayList) a;
}
Vantagem: aqui você economiza tempo ao não iterar todos os objetos.
Desvantagem: pode causar um buraco no pé.
Você pode usar um caractere curinga para fazer isso da seguinte forma
ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);
Seu código ArrayList<String> list2 = (String)list;
não compila porque list2
não é do tipo String
. Mas esse não é o ú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)));
Com Java Generics obtém uma lista de X e retorna uma lista de T que estende ou implementa 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;
}