ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Provai:
ArrayList<String> list2 = (String)list;
Ma mi ha dato un errore di compilazione.
ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Provai:
ArrayList<String> list2 = (String)list;
Ma mi ha dato un errore di compilazione.
Risposte:
Poiché questo in realtà non è un elenco di stringhe, il modo più semplice è passarci sopra e convertire ogni elemento in un nuovo elenco di stringhe:
List<String> strings = list.stream()
.map(object -> Objects.toString(object, null))
.collect(Collectors.toList());
O quando non sei ancora su Java 8:
List<String> strings = new ArrayList<>(list.size());
for (Object object : list) {
strings.add(Objects.toString(object, null));
}
O quando non sei ancora su Java 7:
List<String> strings = new ArrayList<String>(list.size());
for (Object object : list) {
strings.add(object != null ? object.toString() : null);
}
Nota che dovresti dichiarare contro l'interfaccia ( java.util.Listin questo caso), non l'implementazione.
String.valueOf(object), non dovrai fare la object != null ? object.toString() : nullcosa
"null"invece del letterale null. Dipende ulteriormente dai requisiti aziendali che sia desiderabile o meno. Per me, non sarebbe stato affatto accettabile in quanto introduce un bug potenzialmente importante.
"null"non lo è nullaffatto. Il nullha un significato speciale in Java. Non ha senso essere costretti a farlo if (item.equals("null"))durante il controllo successivo.
Non è sicuro farlo!
Immagina se avessi:
ArrayList<Object> list = new ArrayList<Object>();
list.add(new Employee("Jonh"));
list.add(new Car("BMW","M3"));
list.add(new Chocolate("Twix"));
Non avrebbe senso convertire l'elenco di quegli oggetti in qualsiasi tipo.
Object#toString()metodo ignorato. Tuttavia, l'intera conversione del tipo da X a String per scopi diversi dalla presentazione umana non ha davvero molto senso.
Se vuoi farlo in modo sporco, prova questo.
@SuppressWarnings("unchecked")
public ArrayList<String> convert(ArrayList<Object> a) {
return (ArrayList) a;
}
Vantaggio: qui risparmi tempo non iterando su tutti gli oggetti.
Svantaggio: può produrre un buco nel piede.
È possibile utilizzare il carattere jolly per eseguire questa operazione come segue
ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);
Il tuo codice ArrayList<String> list2 = (String)list;non viene compilato perché list2non è di tipo String. Ma non è l'unico problema.
Utilizzando 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 Prende un elenco di X e restituisce un elenco di T che estende o 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;
}