ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Tôi đã thử:
ArrayList<String> list2 = (String)list;
Nhưng nó đã cho tôi một lỗi biên dịch.
ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());
Tôi đã thử:
ArrayList<String> list2 = (String)list;
Nhưng nó đã cho tôi một lỗi biên dịch.
Câu trả lời:
Vì đây thực sự không phải là danh sách các chuỗi, cách dễ nhất là lặp lại nó và tự chuyển đổi từng mục thành một danh sách chuỗi mới:
List<String> strings = list.stream()
.map(object -> Objects.toString(object, null))
.collect(Collectors.toList());
Hoặc khi bạn chưa sử dụng Java 8:
List<String> strings = new ArrayList<>(list.size());
for (Object object : list) {
strings.add(Objects.toString(object, null));
}
Hoặc khi bạn chưa sử dụng Java 7:
List<String> strings = new ArrayList<String>(list.size());
for (Object object : list) {
strings.add(object != null ? object.toString() : null);
}
Lưu ý rằng bạn nên khai báo với giao diện ( java.util.List
trong trường hợp này), chứ không phải việc triển khai.
String.valueOf(object)
, bạn sẽ không phải làm những object != null ? object.toString() : null
điều
"null"
thay vì chữ null
. Nó phụ thuộc thêm vào các điều kiện kinh doanh cho dù đó là mong muốn hay không. Đối với tôi, nó sẽ không thể chấp nhận được chút nào vì nó giới thiệu một lỗi lớn tiềm ẩn.
"null"
không hề null
. Có null
một ý nghĩa đặc biệt trong Java. Không có ý nghĩa gì nếu bạn buộc phải làm if (item.equals("null"))
khi kiểm tra điều đó sau đó.
Thật không an toàn khi làm điều đó!
Hãy tưởng tượng nếu bạn có:
ArrayList<Object> list = new ArrayList<Object>();
list.add(new Employee("Jonh"));
list.add(new Car("BMW","M3"));
list.add(new Chocolate("Twix"));
Sẽ không có ý nghĩa nếu chuyển đổi danh sách các Đối tượng đó thành bất kỳ loại nào.
Object#toString()
ghi đè phương thức. Tuy nhiên, việc chuyển đổi toàn bộ kiểu từ X sang Chuỗi cho các mục đích khác ngoài việc trình bày của con người thực sự không có nhiều ý nghĩa.
Nếu bạn muốn làm theo cách bẩn thỉu, hãy thử cách này.
@SuppressWarnings("unchecked")
public ArrayList<String> convert(ArrayList<Object> a) {
return (ArrayList) a;
}
Ưu điểm: ở đây bạn tiết kiệm thời gian bằng cách không lặp lại trên tất cả các đối tượng.
Bất lợi: có thể tạo ra một lỗ trên bàn chân của bạn.
Bạn có thể sử dụng ký tự đại diện để thực hiện việc này như sau
ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);
Mã của bạn ArrayList<String> list2 = (String)list;
không biên dịch vì list2
không thuộc loại String
. Nhưng đó không phải là vấn đề duy nhất.
Sử dụng 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)));
Với Java Generics Lấy danh sách X và trả về danh sách T mở rộng hoặc triển khai 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;
}