ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Ich habe es versucht:
ArrayList<String> list2 = (String)list;
Aber es gab mir einen Kompilierungsfehler.
ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Ich habe es versucht:
ArrayList<String> list2 = (String)list;
Aber es gab mir einen Kompilierungsfehler.
Antworten:
Da es sich eigentlich nicht um eine Liste von Zeichenfolgen handelt, können Sie diese am einfachsten durchlaufen und jedes Element selbst in eine neue Liste von Zeichenfolgen konvertieren:
List<String> strings = list.stream()
.map(object -> Objects.toString(object, null))
.collect(Collectors.toList());
Oder wenn Sie noch nicht mit Java 8 arbeiten:
List<String> strings = new ArrayList<>(list.size());
for (Object object : list) {
strings.add(Objects.toString(object, null));
}
Oder wenn Sie noch nicht mit Java 7 arbeiten:
List<String> strings = new ArrayList<String>(list.size());
for (Object object : list) {
strings.add(object != null ? object.toString() : null);
}
Beachten Sie, dass Sie sich gegen die Schnittstelle ( java.util.List
in diesem Fall) und nicht gegen die Implementierung aussprechen sollten.
String.valueOf(object)
, müssen Sie das object != null ? object.toString() : null
Ding nicht tun
"null"
anstelle des Literal hinzugefügt null
. Es hängt weiter von den Geschäftsanforderungen ab, ob dies wünschenswert ist oder nicht. Für mich wäre es überhaupt nicht akzeptabel gewesen, da es einen potenziell schwerwiegenden Fehler verursacht.
"null"
ist überhaupt nicht null
. Das null
hat in Java eine besondere Bedeutung. Es macht keinen Sinn, gezwungen zu sein, dies zu if (item.equals("null"))
überprüfen.
Das ist nicht sicher!
Stellen Sie sich vor, Sie hätten:
ArrayList<Object> list = new ArrayList<Object>();
list.add(new Employee("Jonh"));
list.add(new Car("BMW","M3"));
list.add(new Chocolate("Twix"));
Es wäre nicht sinnvoll, die Liste dieser Objekte in einen beliebigen Typ zu konvertieren.
Object#toString()
Methode überschrieben. Die gesamte Typkonvertierung von X in String für andere Zwecke als die menschliche Darstellung ist jedoch in der Tat nicht sehr sinnvoll.
Wenn Sie es auf schmutzige Weise tun möchten, versuchen Sie dies.
@SuppressWarnings("unchecked")
public ArrayList<String> convert(ArrayList<Object> a) {
return (ArrayList) a;
}
Vorteil: Hier sparen Sie Zeit, indem Sie nicht alle Objekte durchlaufen.
Nachteil: Kann ein Loch in Ihrem Fuß erzeugen.
Sie können dazu einen Platzhalter verwenden
ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);
Ihr Code ArrayList<String> list2 = (String)list;
wird nicht kompiliert, da er list2
nicht vom Typ ist String
. Das ist aber nicht das einzige Problem.
Verwenden von 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)));
Mit Java Generics Nimmt eine Liste von X und gibt eine Liste von T zurück, die X erweitert oder implementiert, 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;
}