2014-09-15 20 views
6

Tôi đã xác định phương thức tĩnh assertThat để mở rộng AssertJ. Phương pháp này chấp nhận một biểu thức lambda loại:Gọi phương thức mơ hồ với Lambda trong Java

@FunctionalInterface 
public interface Action { 
    void execute() throws Exception; 
} 

Chữ ký trông như thế này:

public static ExceptionAssert assertThat(Action action) 

Tôi muốn sử dụng phương pháp này với một khẩu tĩnh. Nhưng nó là mơ hồ. Trình biên dịch không biết liệu assertThat(Iterable) hay phương pháp của tôi nên được sử dụng. Tôi không hiểu phương thức void có thể xung đột với phương thức trả về số Iterator<T>.

Bất kỳ ý tưởng nào về cách giải quyết xung đột này (không viết tên lớp trước assertThat)?

Trả lời

11

Bạn nên xác định loại lambda một cách rõ ràng:

assertThat((Action)() -> { 
    ... 
}); 

Các tùy chọn khác là chỉ sử dụng tên khác, ví dụ, assertNoException

1

Tôi không hiểu tại sao một phương pháp có thể void xung đột với phương thức trả về Iterator<T>.

Cách duy nhất bạn có thể có xung đột như vậy là khi biểu thức lambda của bạn không bao giờ hoàn thành bình thường, ví dụ: ()->{ throw new RuntimeException(); } hoặc ()->{ for(;;); }.

(hoặc nếu biểu thức lambda của bạn bao gồm gọi phương pháp duy nhất mà thực sự trả về một Iterable)

Đối với tất cả các trường hợp khác bạn là đúng, có nên không phải là một cuộc xung đột như vậy, và thực sự tôi có thể biên dịch mã tương đương mà không có bất kỳ vấn đề nào với jdk1.8.0_20 cho các biểu thức lambda thông thường (bạn không bao gồm mã kích hoạt lỗi trong câu hỏi của bạn).

Nếu bạn gặp sự cố với biểu thức lambda có thể hoàn thành bình thường và đã sử dụng một jdk cũ hơn, bạn gặp lỗi được thảo luận here. This answer đề cập đến phần đặc điểm kỹ thuật ngôn ngữ chỉ định sự khác biệt giữa các biểu thức lambda tương thích và giá trị tương thích giữa void và tương thích với giá trị.

Nếu bạn đã sử dụng trình biên dịch hoặc IDE khác, ví dụ: Eclipse, đảm bảo bạn đang sử dụng phiên bản mới nhất và gửi báo cáo lỗi, nếu lỗi này vẫn xảy ra.

+0

Nó thực sự là vấn đề mà mã ném một ngoại lệ. – deamon

0

Tôi gặp vấn đề tương tự với phiên bản nhật thực 4.4.1
Nâng cấp lên 4.4.2 đã giải quyết vấn đề.

0

Tôi vừa gặp phải vấn đề tương tự và khi brafdlog đề xuất nâng cấp lên phiên bản nhật thực mới hơn đã sửa nó. Ngoại trừ trong trường hợp của tôi tôi đã có trên 4.4.2 (Spring Tool Suite 3.6.4) và nâng cấp lên Eclipse Neon 4.6.1 mới nhất đã sửa nó.

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