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.List
Uygulamaya 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ç null
de değil . null
Java ö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 list2
tü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;
}