Warum willst du das machen? Ich meine, es ist nicht sicher. Schauen Sie sich das Beispiel an.
Athspk
6
Sie fügen Nicht-Strings in die Liste ein. Was erwarten Sie von dem, was passiert, wenn Sie sie zu Strings zwingen?
Ben Zotto
5
Ich nehme an, Sie meinten: ArrayList <String> list2 = (ArrayList <String>) list;
Costi Ciudatu
Antworten:
130
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:
Mir gefällt, wie Nullwerte bei dieser Implementierung erhalten bleiben.
4
Wenn Sie verwenden String.valueOf(object), müssen Sie das object != null ? object.toString() : nullDing nicht tun
user219882
2
@Tomas: Es würde eine Zeichenfolge mit Wert "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.
BalusC
1
@Tomas: "null"ist überhaupt nicht null. Das nullhat in Java eine besondere Bedeutung. Es macht keinen Sinn, gezwungen zu sein, dies zu if (item.equals("null"))überprüfen.
BalusC
1
@Tomas: Sie besiegen nur die starke Typisierung von Java auf diese Weise. Aber wie gesagt, es hängt von den Geschäftsanforderungen ab, ob dies wünschenswert ist. Für mich ist das einfach inakzeptabel. Tun Sie, was Sie wollen und die Zeit wird lehren :)
BalusC
18
Das ist nicht sicher!
Stellen Sie sich vor, Sie hätten:
ArrayList<Object> list =newArrayList<Object>();
list.add(newEmployee("Jonh"));
list.add(newCar("BMW","M3"));
list.add(newChocolate("Twix"));
Es wäre nicht sinnvoll, die Liste dieser Objekte in einen beliebigen Typ zu konvertieren.
Es sei denn, sie haben die 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.
BalusC
13
Wenn Sie es auf schmutzige Weise tun möchten, versuchen Sie dies.
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")publicstatic<T extends X, X>ArrayList<T> convertToClazz(ArrayList<X> from,Class<X> inClazz,Class<T> outClazz){ArrayList<T> to =newArrayList<T>();for(X data : from){
to.add((T) data);}return to;}
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:
Oder wenn Sie noch nicht mit Java 8 arbeiten:
Oder wenn Sie noch nicht mit Java 7 arbeiten:
Beachten Sie, dass Sie sich gegen die Schnittstelle (
java.util.List
in diesem Fall) und nicht gegen die Implementierung aussprechen sollten.quelle
String.valueOf(object)
, müssen Sie dasobject != null ? object.toString() : null
Ding nicht tun"null"
anstelle des Literal hinzugefügtnull
. 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 nichtnull
. Dasnull
hat in Java eine besondere Bedeutung. Es macht keinen Sinn, gezwungen zu sein, dies zuif (item.equals("null"))
überprüfen.Das ist nicht sicher!
Stellen Sie sich vor, Sie hätten:
Es wäre nicht sinnvoll, die Liste dieser Objekte in einen beliebigen Typ zu konvertieren.
quelle
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.
Vorteil: Hier sparen Sie Zeit, indem Sie nicht alle Objekte durchlaufen.
Nachteil: Kann ein Loch in Ihrem Fuß erzeugen.
quelle
Mit Guave :
quelle
Mit Java 8 können Sie Folgendes tun:
quelle
Sie können dazu einen Platzhalter verwenden
quelle
Hier ist eine weitere Alternative mit Guava
quelle
Ihr Code
ArrayList<String> list2 = (String)list;
wird nicht kompiliert, da erlist2
nicht vom Typ istString
. Das ist aber nicht das einzige Problem.quelle
Verwenden von Java 8 Lambda:
quelle
Mit Java Generics Nimmt eine Liste von X und gibt eine Liste von T zurück, die X erweitert oder implementiert, Sweet!
quelle
Eine einfache Lösung:
Hinweis: Dies funktioniert, wenn die Liste alle Elemente des Datentyps String enthält.
quelle