2017-10-24 35 views
5

Tôi đã sau hai mã đơn giản:IntFunction <String> và Function <Integer, String>

IntFunction<String> f1 = Integer::toString; 
Function<Integer, String> f2 = Integer::toString; 

Tôi nghĩ rằng cả hai định nghĩa là chính xác và tương đương điều tương tự, nhưng một trong những thứ hai đã biên dịch lỗi, phàn nàn rằng Required Function<Integer, String>,but Method Reference is found.

Trả lời

6

các tài liệu tham khảo phương pháp thứ hai là mơ hồ:

cả phương pháp static

public static String toString(int i) 

và phương pháp dụ

public String toString() 

được áp dụng.

Nếu bạn viết sự phân công thứ hai sử dụng biểu thức lambda, bạn có thể thấy có hai phương pháp bạn có thể sử dụng:

Function<Integer, String> f2 = i -> Integer.toString (i); 

hoặc

Function<Integer, String> f2 = i -> i.toString(); 

khi bạn gán Integer::toString, trình biên dịch có thể không quyết định phương pháp nào bạn đang đề cập đến.

Mặt khác, trong trường hợp IntFunction<String>, chỉ áp dụng public static String toString(int i).

+0

Cảm ơn @eran .. Tôi hiểu, tôi không hiểu rõ về tham chiếu phương pháp dụ ... – Tom

+2

Hoặc 'Hàm f2 = String :: valueOf;' để gọi một 'static' tương đương phương thức hoặc 'Hàm f2 = Object :: toString;' để có được tương đương với 'i -> i.toString()'… – Holger

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