2014-07-17 50 views
8

Tôi tự hỏi liệu có khả năng trong Java 8 không, để lấy tham chiếu phương thức của toán tử chuẩn (+, -, <,>, ...).Java 8: Nhận toán tử-hàm-đối tượng với tham chiếu phương thức

Tôi muốn nhận nó giống như Foo::+ nơi Foo là một số nơi được xác định nơi tôi có thể tải xuống. Vì Java không cho phép các ký tự đặc biệt trong các tên phương thức mà tôi không nghĩ là có thể, phải không?

Nếu cách trên không tồn tại: Có một số nơi các toán tử chuẩn được xác định là Foo::plus không?

Tôi biết có khả năng xác định nó là lambda ((x, y) -> x + y), nhưng theo ý kiến ​​của tôi, nó có thể mang tính biểu cảm hơn trong một số trường hợp với một phương pháp tham chiếu đến toán tử giống như có thể trong Haskell.

Trả lời

7

Tôi tin rằng bạn đang tìm kiếm int Integer.sum(int, int) và các phương pháp tương tự, thực sự được API cung cấp.

Có rất nhiều phương pháp trong danh sách của bạn bị thiếu, nhưng thông thường JDK không cung cấp cho bạn sự tiện lợi cuối cùng vì kích thước của nó rất lớn ngay cả khi không có.

Nếu đó là bất kỳ sự an ủi nào, mỗi dự án của tôi có một lớp Util nơi tôi đổ mẩu tin như vậy.

+0

Nhà khai thác như>, <, quá? Tôi không biết phải nhìn đâu. –

+0

Có một số nơi, có thể tất cả các toán tử được xác định không? Một số lớp chỉ có các phương thức tĩnh có thể có tên 'Ops' hoặc một cái gì đó như thế? –

+0

Không, tôi không nghĩ vậy. 'Integer.compare' của Ther, nhưng bạn vẫn phải viết một số mã để nhận các biến vị ngữ boolean. –

0

Toán tử chuẩn chỉ áp dụng cho nguyên thủy và nguyên thủy được đóng hộp và bạn không thể tìm thấy toán tử nào có thể áp dụng cho đối tượng được đề cập.

Chỉnh sửa: Nếu bạn muốn biết bạn có thể gọi phương thức nào để thực hiện các hàm toán tử chuẩn, bạn có thể thực hiện kiểm tra instanceof đến giao diện có thể so sánh cho các toán tử lớn hơn/nhỏ hơn hoặc bằng (http://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html).

+0

"Toán tử chuẩn chỉ áp dụng cho nguyên thủy và nguyên thủy đóng hộp, và bạn không thể tự động tìm toán tử nào được áp dụng cho đối tượng được đề cập." Tôi không hiểu điều đó. Tôi nghĩ rằng trình biên dịch có thể tìm ra, nếu các loại phù hợp. (Vâng, có lẽ tiếng anh của tôi chỉ là quá xấu để hiểu nó ;-)) –

+0

Ok, trong khi thực hiện '<' Tôi thấy những gì bạn có ý nghĩa. Không thể thực hiện '<' với siêu lớp 'Số'. –

+0

Toán tử duy nhất hoạt động trên các đối tượng là ==. Điều này là bởi vì nó không thực sự so sánh các đối tượng mà chỉ là tham chiếu (con trỏ nếu bạn quen với C++). Vì vậy, nếu 2 đối tượng có cùng nội dung, nhưng chúng không phải là cùng một đối tượng, chúng vẫn không trả về giá trị true trên toán tử ==. – grimmeld

1

Cách sạch sẽ là lớp trợ giúp Operators chứa phương pháp cho tất cả các nhà khai thác. Sau đó, bạn có thể sử dụng các phương thức này làm tham chiếu. Tất nhiên, một lớp thư viện chuẩn sẽ đẹp hơn một lớp trợ giúp của riêng, nhưng ít nhất bạn có thể quyết định tên của lớp trợ giúp đó, vì vậy bạn có thể chọn một tên rõ ràng nhất cho bạn.

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