Tham chiếu phương thức và Generics trong Java-8


11

Tôi đang đối mặt với vấn đề với tham chiếu phương thức kết hợp với các loại chung chung.

Chúng tôi có mã nơi chúng tôi cần gọi một phương thức quá tải, nhưng nó không thành công với lỗi:

Không thể giải quyết giá trị m1 ()

Tôi đã đơn giản hóa vấn đề của mình để làm rõ vấn đề nằm ở đâu.

Đoạn mã sau không thành công:

public class Test {
    void test() {
        // Getting error here
        setValue(C1::m1, Integer.ONE);
    }

    <E extends I1, T> void setValue(BiConsumer<E, T> cons, T value) {
    }
}

interface I1 {
}

class C1 implements I1 {
    void m1(Integer value) {
    }

    void m1(int value) {
    }
}

Ai đó có thể xin vui lòng tại sao điều này là hành xử như thế này?

Vui lòng lưu ý rằng điều này không liên quan đến câu hỏi Tham chiếu Phương thức Java 8 với các kiểu chung


không, nếu tôi loại bỏ một trong những phương pháp thì nó vẫn hoạt động tốt
Joker

Cảm ơn vì đã mở lại câu hỏi này một lần nữa ... :)
Joker

Câu trả lời:


7

Dường như các quy tắc suy luận kiểu không đủ "thông minh" để giải quyết xung đột giữa việc chọn đúng m1biến thể và tạo ra các tham số loại được suy luận chính xác cho setValuecuộc gọi ( BBigDecimaltương ứng).

Tôi hoàn toàn không thể giải thích tại sao điều này thất bại, nhưng suy luận kiểu truyền thống là một lĩnh vực với các quy tắc phức tạp, hợp lý và không trực quan, vì vậy tôi không ngạc nhiên lắm.

Bạn có thể giải quyết vấn đề này bằng cách thêm một nhân chứng loại (chỉ định loại tham số nào bạn muốn gọi setValue) tại điểm mà trình biên dịch sẽ chọn m1phương thức đúng :

this.<B,BigDecimal>setValue(B::m1, BigDecimal.ONE);

Có vẻ như tôi không liên kết với docs.oracle.com/javase/specs/jls/se8/html/ Kẻ
Joker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.