2011-03-03 43 views
14

Khi tôi cố gắng để chuyển đổi một mảng đúp vào một ArrayList đúp Tôi đã nhận lỗi sau:Chuyển đổi một mảng đúp để đôi ArrayList

Exception in thread "main" java.lang.ClassCastException: [D cannot be cast to java.lang.Double

Dưới đây là mã của tôi.

double [] firstValueArray ; 

ArrayList <Double> firstValueList = new ArrayList (Arrays.asList(firstValueArray));

tôi so sánh danh sách này với một danh sách khác và gán kết quả đến một biến kép.

Vui lòng cho tôi biết lý do của lỗi này.

+5

'cho (doule d: doubleArray) mảngList.add (d);' – bestsss

Trả lời

24

Than ôi, Arrays.asList(..) không hoạt động với nguyên thủy. Apache commons-lang có

Double[] doubleArray = ArrayUtils.toObject(durationValueArray); 
List<Double> list = Arrays.asList(doubleArray); 
+0

Cảm ơn rất nhiều Bozho. Nó giải quyết được vấn đề. – gishara

17

Guava 's phiên bản thậm chí còn ngắn hơn:

List<Double> list = Doubles.asList(doubleArray); 

tham khảo:

Lưu ý: Đây là phương pháp varargs. Tất cả các phương thức varargs có thể được gọi bằng cách sử dụng một mảng cùng loại (nhưng không phải kiểu tương ứng với hộp/không được đóng hộp !!). Hai gọi là tương đương:

Doubles.asList(new double[]{1d,2d}); 
Doubles.asList(1d,2d); 

Ngoài ra, phiên bản Ổi không làm một traverse đầy đủ, đó là một cái nhìn Danh sách trực tiếp của mảng nguyên thủy, chuyển đổi nguyên thủy to Objects chỉ khi chúng được truy cập.

+0

Phương pháp varargs là gì? và hai cuộc gọi tương đương như thế nào? – JAVA

+0

@sunny cơ chế được mô tả ở đây: [Hướng dẫn Java: Số lượng đối số tùy ý] (http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html#varargs). Cụm từ chính là "Đó là một lối tắt để tạo mảng bằng tay" –

+0

Dường như danh sách được trả về bởi 'Doubles.asList (double ... backingArray)', không cho phép bất kỳ thay đổi nào, chẳng hạn như thêm các phần tử vào danh sách bằng ' add' hoặc 'addAll'. Đã cập nhật liên kết thành tài liệu: https://google.github.io/guava/releases/19.0/api/docs/index.html?com/google/common/primitives/Doubles.html –

3

tín dụng để bestsss cho những nhận xét mà phải là câu trả lời:

ArrayList<Double> firstValueList = new ArrayList<Double>(); 
for(double d : firstValueArray) firstValueList.add(d); 
12

Sử dụng Java 8 Streams API này được thực hiện với

DoubleStream.of(doublesArray).boxed().collect(Collectors.toList()); 

Nếu trả lại một ArrayList như một thực hiện được yêu cầu sau đó sử dụng

DoubleStream.of(doublesArray).boxed().collect(Collectors.toCollection(ArrayList::new)); 

Lớp lót một lớp này không yêu cầu bất kỳ thư viện bổ sung.

Các vấn đề liên quan