ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Denedim:
ArrayList<String> list2 = (String)list;
Ama bana bir derleme hatası verdi.
ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Denedim:
ArrayList<String> list2 = (String)list;
Ama bana bir derleme hatası verdi.
Yanıtlar:
Bu aslında bir dizge listesi olmadığından, en kolay yol üzerinde döngü yapmak ve her öğeyi kendiniz yeni bir dizgi listesine dönüştürmektir:
List<String> strings = list.stream()
.map(object -> Objects.toString(object, null))
.collect(Collectors.toList());
Veya henüz Java 8 kullanmadığınızda:
List<String> strings = new ArrayList<>(list.size());
for (Object object : list) {
strings.add(Objects.toString(object, null));
}
Veya henüz Java 7 kullanmadığınızda:
List<String> strings = new ArrayList<String>(list.size());
for (Object object : list) {
strings.add(object != null ? object.toString() : null);
}
java.util.ListUygulamaya değil ( bu durumda) arayüze karşı bildirimde bulunmanız gerektiğini unutmayın .
String.valueOf(object), yapmanız gerekmeyecek object != null ? object.toString() : nullşey
"null"değişmez değer yerine değer içeren bir dize ekler null. Bunun istenip istenmeyeceği iş gereksinimlerine de bağlıdır. Benim için, potansiyel olarak büyük bir hatayı ortaya çıkardığı için hiç kabul edilemezdi.
"null"hiç nullde değil . nullJava özel bir anlamı vardır. Daha if (item.equals("null"))sonra bunu kontrol ederken yapmaya zorlanmanın bir anlamı yok .
Bunu yapmak güvenli değil!
Şunlara sahip olduğunuzu hayal edin:
ArrayList<Object> list = new ArrayList<Object>();
list.add(new Employee("Jonh"));
list.add(new Car("BMW","M3"));
list.add(new Chocolate("Twix"));
Bu Nesnelerin listesini herhangi bir türe dönüştürmek mantıklı olmaz.
Object#toString()Yöntemi geçersiz kılmadıkları sürece . Bununla birlikte, insan sunumundan başka amaçlar için X'ten String'e tüm tip dönüşümü gerçekten çok mantıklı değildir.
Kirli bir şekilde yapmak istiyorsanız, bunu deneyin.
@SuppressWarnings("unchecked")
public ArrayList<String> convert(ArrayList<Object> a) {
return (ArrayList) a;
}
Avantaj: burada tüm nesneler üzerinde yineleme yapmayarak zamandan tasarruf edersiniz.
Dezavantaj: Ayağınızda delik oluşturabilir.
Bunu aşağıdaki gibi yapmak için joker karakter kullanabilirsiniz
ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);
Kodunuz ArrayList<String> list2 = (String)list;çünkü derleme değil list2türde değil String. Ancak tek sorun bu değil.
Java 8 lambda kullanarak:
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)));
Java ile Generics X'in bir listesini alır ve X'i genişleten veya uygulayan bir T listesi döndürür, 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;
}