ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
J'ai essayé:
ArrayList<String> list2 = (String)list;
Mais cela m'a donné une erreur de compilation.
ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
J'ai essayé:
ArrayList<String> list2 = (String)list;
Mais cela m'a donné une erreur de compilation.
Réponses:
Comme il ne s'agit en fait pas d'une liste de chaînes, le moyen le plus simple est de la boucler et de convertir vous-même chaque élément en une nouvelle liste de chaînes:
List<String> strings = list.stream()
.map(object -> Objects.toString(object, null))
.collect(Collectors.toList());
Ou lorsque vous n'êtes pas encore sur Java 8:
List<String> strings = new ArrayList<>(list.size());
for (Object object : list) {
strings.add(Objects.toString(object, null));
}
Ou lorsque vous n'êtes pas encore sur Java 7:
List<String> strings = new ArrayList<String>(list.size());
for (Object object : list) {
strings.add(object != null ? object.toString() : null);
}
Notez que vous devez déclarer par rapport à l'interface ( java.util.List
dans ce cas), pas à l'implémentation.
String.valueOf(object)
, vous n'aurez pas à faire la object != null ? object.toString() : null
chose
"null"
au lieu du littéral null
. Cela dépend en outre des exigences de l'entreprise, que ce soit souhaitable ou non. Pour moi, cela n'aurait pas du tout été acceptable car cela introduit un bug potentiellement majeur.
"null"
pas null
du tout. Le null
a une signification particulière en Java. Cela n'a aucun sens d'être obligé de le faire if (item.equals("null"))
lors de la vérification de cela par la suite.
Ce n'est pas sûr de faire ça!
Imaginez si vous aviez:
ArrayList<Object> list = new ArrayList<Object>();
list.add(new Employee("Jonh"));
list.add(new Car("BMW","M3"));
list.add(new Chocolate("Twix"));
Cela n'aurait aucun sens de convertir la liste de ces objets en n'importe quel type.
Object#toString()
remplacé la méthode. Cependant, toute la conversion de type de X en String à d'autres fins que la présentation humaine n'a en effet pas beaucoup de sens.
Si vous voulez le faire de manière sale, essayez ceci.
@SuppressWarnings("unchecked")
public ArrayList<String> convert(ArrayList<Object> a) {
return (ArrayList) a;
}
Avantage: ici vous gagnez du temps en n'itérant pas sur tous les objets.
Inconvénient: peut produire un trou dans votre pied.
Vous pouvez utiliser un caractère générique pour le faire comme suit
ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);
Votre code ArrayList<String> list2 = (String)list;
ne se compile pas car il list2
n'est pas de type String
. Mais ce n'est pas le seul problème.
Utilisation de 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)));
Avec Java Generics Prend une liste de X et renvoie une liste de T qui étend ou implémente 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;
}
Une solution simple:
List<Object> lst =listOfTypeObject;
ArrayList<String> aryLst = new ArrayList<String>();
for (int i = 0; i < lst.size(); i++) {
aryLst.add(lst.get(i).toString());
}
Remarque: cela fonctionne lorsque la liste contient tous les éléments du type de données String.