2016-06-30 44 views
9

Tôi gặp vấn đề về Java 8 Runnable.Cách gán giá trị tham chiếu phương thức cho Runnable

public static void main(String[] args) { 
    Runnable r1 = Test::t1; 
    Runnable r2 = Test::t2; 
    Runnable r3 = Test::t3; 
} 

public static void t1() { 

} 

public static String t2() { 
    return "abc"; 
} 

public static String t3(String t) { 
    return t; 
} 

Như chương trình mã, tôi hiểu r1 là đúng và r3 là sai, nhưng tôi không hiểu tại sao r2 cũng là đúng. Ai có thể giúp tôi hiểu nó không?

+0

@YassinHajaj Huh, bạn nói đúng! Xin lỗi, thất bại của tôi :) – Hrabosch

+0

@ Hrabosch Không vấn đề gì :) –

+0

@ Hrabosch , r3 là sai, tôi chỉ không hiểu tại sao r2 là đúng –

Trả lời

14

r2 là tốt do section 15.13.2 of the JLS, trong đó bao gồm:

Một biểu thức phương pháp tham khảo là đồng dư với một loại chức năng nếu cả hai sau là đúng:

  • Các loại chức năng xác định một khai báo thời gian biên dịch đơn tương ứng với tham chiếu.

  • Một trong những điều sau đây là đúng:

    • Kết quả của các loại chức năng có hiệu lực.
    • Kết quả của kiểu hàm là R, và kết quả của việc áp dụng chuyển đổi bắt (§5.1.10) cho kiểu trả về kiểu gọi (§15.12.2.6) của khai báo biên dịch đã chọn là R '(trong đó R là kiểu đích có thể được sử dụng để suy ra R '), và cả R và R' đều không có hiệu lực, và R 'tương thích với R trong ngữ cảnh gán.

Về cơ bản, nó sẽ có giá trị để viết t2(); và chỉ cần bỏ qua các giá trị trả về, vì vậy nó có giá trị để tạo ra một tài liệu tham khảo phương pháp trong đó kêu gọi phương pháp này và bỏ qua các giá trị trả về.

t3không hợp lệ, bởi vì bạn phải cung cấp một tham số, và Runnablekhông mất một tham số, do đó muốn có gì để "vượt qua trên" để phương pháp này.

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