2009-11-06 44 views
126

Vui lòng cho tôi biết liệu có thể khai thác quá tải trong Java không? Nếu nó được sử dụng bất cứ nơi nào trong Java, bạn có thể vui lòng cho tôi biết về nó.Quá tải toán tử trong Java

+0

Bản sao có thể có của [Tại sao Java không cung cấp quá tải cho nhà điều hành?] (Https://stackoverflow.com/questions/77718/why-doesnt-java-offer-operator-overloading) –

Trả lời

180

Không, Java không hỗ trợ quá tải toán tử do người dùng xác định. Khía cạnh duy nhất của Java đi kèm với quá tải "toán tử" tùy chỉnh là việc xử lý + cho chuỗi, hoặc kết quả trong việc kết nối thời gian biên dịch của các hằng số hoặc kết nối thời gian thực thi bằng cách sử dụng StringBuilder/StringBuffer. Bạn không thể xác định các toán tử của riêng bạn hoạt động theo cùng một cách.

Đối với ngôn ngữ giống như Java (và dựa trên JVM) mà không hỗ trợ quá tải toán tử, bạn có thể xem Groovy. Ngoài ra, bạn có thể tìm thấy may mắn với Java compiler plugin solution.

+3

Bạn đang nói chúng tôi không thể tạo trình bao bọc trong java? Chẳng hạn như SmallInteger như Integer? –

+1

@ tuğrulbüyükışık: Đã có các trình bao bọc cho tất cả các kiểu nguyên thủy hiện có - nhưng nếu bạn muốn tạo kiểu trình bao bọc mới của riêng mình, bạn sẽ không thể làm cho nó giống như những cái khác, vì chúng có hỗ trợ cụ thể trong ngôn ngữ . –

+1

cảm ơn, tôi googled về nó và couldnt tìm thấy. Tôi muốn biết nếu tôi có thể tạo ra một biến phức tạp gồm hai nguyên thủy (một gấp đôi và một int ---> độ chính xác tốt + phạm vi tốt) –

14

Bạn không thể tự làm điều này vì Java không cho phép quá tải toán tử.

Với một ngoại lệ. ++ = bị quá tải cho đối tượng chuỗi.

+0

Bị bỏ phiếu tại sao? –

+5

Có nhiều ví dụ khác về quá tải toán tử trong Java. Ví dụ '&', '|', và '^' là quá tải cho 'boolean' và các kiểu tích phân. Và thực sự, các toán tử số học và quan hệ bị quá tải cho các kiểu số khác nhau. (Tất nhiên, ngữ nghĩa của tình trạng quá tải gần hơn ...) –

29

điều hành quá tải được sử dụng trong Java cho nối của kiểu String:

String concat = "one" + "two"; 

Tuy nhiên, bạn không có thể định nghĩa quá tải nhà điều hành của riêng bạn.

14

Java không cho phép quá tải toán tử. Cách tiếp cận ưa thích là xác định phương thức trên lớp của bạn để thực hiện tác vụ: a.add(b) thay vì a + b. Bạn có thể thấy một bản tóm tắt của các bit khác Java rời ra từ C như ngôn ngữ ở đây: Features Removed from C and C++

+0

Liên kết thú vị – Wernsey

+2

Điều quan trọng là mục tiêu thiết kế làm cho các tệp nguồn Java bối cảnh độc lập. Cố gắng đọc rất lớn (MLOC), các chương trình C nặng lớn có một đường cong học tập rất dài. Một chương trình Java có thể so sánh (hoặc lớn hơn) không khó nhúng vào hơn một chương trình Java nhỏ. Như Gosling đã nói: Một ngôn ngữ cho các lập trình viên cổ áo màu xanh lam làm việc. [Và bất cứ ai nghĩ rằng verbosity boilerplate là bất lợi nên đọc về chunking trong nhận thức chuyên gia.] –

+1

Nhờ oracle, không có liên kết java.sun.com làm việc. Bạn có thể vui lòng cung cấp liên kết được cập nhật, nếu có thể không? –

20

Ngoài tất cả những người chỉ ra rằng + bị quá tải cho Strings, - cũng bị quá tải cho cả nổi điểm hoạt động và số nguyên, là */.

[sửa] % cũng bị quá tải cho điểm nổi, điều này có thể gây ngạc nhiên cho những người có nền C hoặc C++.

10

Người ta có thể thử Java Operator Overloading. Nó có những hạn chế riêng của nó, nhưng nó có giá trị cố gắng nếu bạn thực sự muốn sử dụng quá tải nhà điều hành.

+0

Hoặc [light/JOps] (https://github.com/light/JOps) –

6

Chỉ cần sử dụng Xtend cùng với mã Java của bạn. Nó hỗ trợ quá tải của nhà điều hành:

package com.example; 

@SuppressWarnings("all") 
public class Test { 
    protected int wrapped; 

    public Test(final int value) { 
    this.wrapped = value; 
    } 

    public int operator_plus(final Test e2) { 
    return (this.wrapped + e2.wrapped); 
    } 
} 

package com.example 

class Test2 { 

    new() { 
     val t1 = new Test(3) 
     val t2 = new Test(5) 
     val t3 = t1 + t2 
    } 

} 

Trên trang web chính thức, có danh sách các phương pháp để triển khai cho từng nhà điều hành!

5

Hoặc, bạn có thể làm cho Java Groovy và chỉ quá tải các chức năng để đạt được những gì bạn muốn

//plus() => for the + operator 
//multiply() => for the * operator 
//leftShift() = for the << operator 
// ... and so on ... 

class Fish { 
    def leftShift(Fish fish) { 
     print "You just << (left shifted) some fish " 
    } 
} 


def fish = new Fish() 
def fish2 = new Fish() 

fish << fish2 

Ai doesnt muốn trở thành/sử dụng groovy? : D

Không, bạn không thể sử dụng các tệp JAR có rãnh được biên dịch trong Java theo cùng một cách. Nó vẫn là một lỗi trình biên dịch cho Java.

6

Như nhiều người khác đã trả lời: Java không hỗ trợ quá tải toán tử do người dùng xác định.

Có thể đây là chủ đề không chính xác, nhưng tôi muốn nhận xét về một số điều tôi đã đọc trong một số câu trả lời.

Giới thiệu về khả năng đọc.
Hãy so sánh:

  1. c = a + b
  2. c = a.add (b)

Nhìn một lần nữa!
Điều nào dễ đọc hơn?

Ngôn ngữ lập trình cho phép tạo các loại do người dùng xác định, nên cho phép chúng hoạt động giống như kiểu tích hợp (hoặc kiểu nguyên thủy).

Vì vậy, Java phá vỡ một nguyên tắc cơ bản của lập trình Generic:
Chúng tôi sẽ có thể trao đổi đối tượng được xây dựng trong các loại với các đối tượng của kiểu do người dùng định nghĩa.
(Bạn có thể tự hỏi: "Ông ấy nói 'đối tượng được xây dựng trong'?" Vâng, see here..)

Về String nối:

nhà toán học sử dụng symnol + cho giao hoán hoạt động trên các bộ.
Vì vậy, chúng tôi có thể chắc chắn rằng a + b = b + a.
Nối chuỗi (trong hầu hết các ngôn ngữ lập trình) không tôn trọng ký hiệu toán học phổ biến này.

a := "hello"; 
b := "world"; 
c := (a + b = b + a); 

hoặc trong Java:

String a = "hello"; 
String b = "world"; 
boolean c = (a + b).equals(b + a); 

Extra:
Chú ý trong bình đẳng Java và bản sắc rất bối rối. Biểu tượng == (bình đẳng) có nghĩa là:
a. Tính bình đẳng đối với các loại nguyên thủy
b. Do đó, việc kiểm tra danh tính cho các loại do người dùng xác định, chúng tôi buộc phải sử dụng hàm bằng() cho sự bình đẳng.
Nhưng ... Điều này có liên quan gì đến quá tải nhà điều hành?
Nếu ngôn ngữ cho phép người vận hành quá tải người dùng có thể cung cấp ý nghĩa thích hợp cho toán tử bình đẳng.

+0

Biểu tượng '==' được sử dụng cho sự bình đẳng trong Java, như trong C và C++. Điều này không liên quan gì đến quá tải của nhà điều hành. –

+2

Toán tử ==, trong Java chỉ có nghĩa là Bình đẳng đối với các kiểu nguyên thủy. Đối với các loại do người dùng xác định có nghĩa là Danh tính. Trong C++, ngữ nghĩa được định nghĩa bởi người dùng, nhưng nên bảo toàn ngữ nghĩa tích hợp, bình đẳng. Chuỗi a = "hello"; Chuỗi b = "hello"; boolean c = (a == b); –

+0

Có, giống như trong C, mà Java đã sao chép. Rant của bạn là về Java nói chung và không có gì để làm với * thực tế * rằng Java không hỗ trợ quá tải nhà điều hành. Khi bạn tạo ra ngôn ngữ của riêng bạn, bạn có thể xác định nó theo cách bạn muốn. –