Tôi nhận được một lỗi trên mã sau đây, mà tôi tin rằng không nên có ... Sử dụng JDK 8u40 để biên dịch mã này.Tham chiếu đến phương pháp không rõ ràng khi sử dụng lambdas và generics
public class Ambiguous {
public static void main(String[] args) {
consumerIntFunctionTest(data -> {
Arrays.sort(data);
}, int[]::new);
consumerIntFunctionTest(Arrays::sort, int[]::new);
}
private static <T> void consumerIntFunctionTest(final Consumer<T> consumer, final IntFunction<T> generator) {
}
private static <T> void consumerIntFunctionTest(final Function<T, ?> consumer, final IntFunction<T> generator) {
}
}
Các lỗi như sau:
Error:(17, 9) java: reference to consumerIntFunctionTest is ambiguous both method consumerIntFunctionTest(java.util.function.Consumer,java.util.function.IntFunction) in net.tuis.ubench.Ambiguous and method consumerIntFunctionTest(java.util.function.Function,java.util.function.IntFunction) in net.tuis.ubench.Ambiguous match
Các lỗi xảy ra trên dòng sau:
consumerIntFunctionTest(Arrays::sort, int[]::new);
Tôi tin rằng không nên có lỗi, như tất cả các tài liệu tham khảo Arrays::sort
là kiểu void
và không ai trong số họ trả về giá trị. Như bạn có thể quan sát, nó hiện hoạt động khi tôi mở rộng rõ ràng lambda Consumer<T>
.
Đây có phải là lỗi trong javac hay trạng thái JLS không thể tự động mở rộng lambda trong trường hợp này? Nếu nó là sau này, tôi vẫn sẽ nghĩ rằng nó là lạ, như consumerIntFunctionTest
với đối số đầu tiên Function<T, ?>
không nên phù hợp.
Địa điểm trong JLS nơi vị trí này cần được xác định là [15.27.3] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27. 3). (Chưa xem chi tiết). – Jesper
Tại sao bạn nghĩ 'Chức năng' không khớp? '?' cũng có thể là 'Void', vì vậy nó khớp với nhau. –
tomse
@tomse 'Void' là kiểu trả về không liên quan gì đến' void' làm kiểu phương thức, rằng 'Void' chỉ là một đối tượng. – skiwi