2014-09-15 18 views
8

Tôi đọc mới được phát hành Java 8 trong hành động và tìm thấy ở đó là một đoạn mã dán từ Chương 5 không biên dịch:Tại sao không sử dụng ví dụ java 8 này bằng cách sử dụng trình biên dịch suy luận kiểu trong Eclipse?

List<Integer> numbers1 = Arrays.asList(1, 2, 3); 
    List<Integer> numbers2 = Arrays.asList(3, 4); 
    List<int[]> pairs = 
    numbers1.stream() 
    .flatMap((Integer i) -> numbers2.stream() 
    .map(j -> new int[]{i, j}) 
    ) 
    .collect(toList()); 

Eclipse nói: "Loại không phù hợp: không thể chuyển đổi từ List<Object> để List<int[]>"

Và sau khi so sánh với những gì tác giả đã đưa ra trên Github, sau đây biên soạn:

List<Integer> numbers1 = Arrays.asList(1, 2, 3); 
    List<Integer> numbers2 = Arrays.asList(3, 4); 
    List<int[]> pairs = 
    numbers1.stream() 
    .flatMap((Integer i) -> numbers2.stream() 
    .map((Integer j) -> new int[]{i, j}) 
    ) 
    .collect(toList()); 

sự thay đổi duy nhất là từ "j" thành "(Integer j)".

Nhưng phiên bản đầu tiên không hoàn toàn tương đương với phiên bản thứ hai có đường cú pháp do Java 8 cung cấp không? Tại sao Java từ chối biên dịch nó?

Cảm ơn

BTW:

java -version 
java version "1.8.0_20" 
Java(TM) SE Runtime Environment (build 1.8.0_20-b26) 
Java HotSpot(TM) Client VM (build 25.20-b23, mixed mode) 
+0

* Argh * này được in trong một cuốn sách ?! – tilois

+0

Không hoàn toàn. Sửa đổi một chút để làm cho câu hỏi hiển nhiên. –

+0

Đã chỉnh sửa tiêu đề để phản ánh rằng nguyên nhân gốc rễ là trong Eclipse. –

Trả lời

15

Thứ nhất, sửa ngữ của bạn: khi bạn nói cú pháp đường, những gì bạn thực sự đang hỏi về là suy luận kiểu, khi được hỏi để suy ra một gõ cho j trong lambda bên trong, trình biên dịch không xuất hiện đúng loại.

Thứ hai, sửa dữ liệu của bạn: Thông báo lỗi bạn trích dẫn không đến từ trình biên dịch JDK; chúng đến từ Eclipse.

Đây chỉ là lỗi của Eclipse. Trình biên dịch tham chiếu (javac từ Oracle JDK) xử lý ví dụ đầu tiên của bạn tốt.

+2

+1 và thêm một bit chẩn đoán nữa: 'Stream pairs = numbers1.stream(). FlatMap (i -> số2.stream(). Map (j -> new int [] {i, j}));' biên dịch tốt, vì vậy chỉ có bước cuối cùng ('.collect()') là nơi suy luận thất bại. –

+0

Xác nhận nó chỉ là về Eclipse. javac đã tạo tệp lớp tốt. Cảm ơn/ –

+0

Bất kỳ từ nào về cách làm cho Eclipse chơi tốt đẹp với các Lambdas này? – Yoshiya

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