Tại sao không thể quá tải một hàm chỉ bằng cách thay đổi kiểu trả về? Điều đó sẽ thay đổi trong một phiên bản Java trong tương lai?
Nhân tiện, chỉ để tham khảo, điều này có khả thi trong C ++ không?
Tại sao không thể quá tải một hàm chỉ bằng cách thay đổi kiểu trả về? Điều đó sẽ thay đổi trong một phiên bản Java trong tương lai?
Nhân tiện, chỉ để tham khảo, điều này có khả thi trong C ++ không?
Câu trả lời:
Bạn không thể làm điều đó trong Java và bạn không thể làm điều đó trong C ++. Lý do là chỉ giá trị trả về là không đủ để trình biên dịch tìm ra hàm nào cần gọi:
public int foo() {...}
public float foo() {..}
...
foo(); // which one?
float
, nó là double
.
foo();
không có kiểu trả về sẽ không rõ ràng không nhất thiết là lý do để không cho phép nó như một quá tải. Có những đối số có thể gây ra sự mơ hồ (ví dụ foo(null);
), nhưng điều đó không làm cho quá tải vốn không hợp lệ.
Lý do là các quá tải trong Java chỉ được phép đối với các phương thức có các chữ ký khác nhau .
Kiểu trả về không phải là một phần của chữ ký phương thức, do đó không thể được sử dụng để phân biệt quá tải.
Xem Định nghĩa các phương pháp từ các hướng dẫn Java.
calculateAnswer(double, int, double, double)
". Thấy rằng loại trả lại không được bao gồm, @konmik.
Trước Java 5.0, khi bạn ghi đè một phương thức, cả tham số và kiểu trả về phải khớp chính xác. Trong Java 5.0, nó giới thiệu một cơ sở mới được gọi là kiểu trả về hiệp phương sai. Bạn có thể ghi đè một phương thức có cùng chữ ký nhưng trả về một lớp con của đối tượng được trả về. Nói cách khác, một phương thức trong lớp con có thể trả về một đối tượng có kiểu là một lớp con của kiểu được phương thức trả về cùng một chữ ký trong lớp cha.
Overloaded
các phương thức trong java có thể có các kiểu trả về khác nhau do đối số cũng khác nhau.
Kiểm tra mã mẫu.
public class B {
public String greet() {
return "Hello";
}
//This will work
public StringBuilder greet(String name) {
return new StringBuilder("Hello " + name);
}
//This will not work
//Error: Duplicate method greet() in type B
public StringBuilder greet() {
return new StringBuilder("Hello Tarzan");
}
}
Kiểu trả về không quan trọng khi nạp chồng một phương thức. Chúng tôi chỉ cần đảm bảo không có sự mơ hồ!
Cách duy nhất Java có thể biết phương thức nào cần gọi là phân biệt các kiểu của danh sách đối số. Nếu trình biên dịch cho phép hai phương thức có cùng tên và cùng kiểu đối số, sẽ không có cách nào để xác định phương thức nào nó sẽ gọi.
Trình biên dịch không xem xét kiểu trả về khi phân biệt các phương thức, vì vậy bạn không thể khai báo hai phương thức với cùng một chữ ký ngay cả khi chúng có kiểu trả về khác nhau.
Nếu bạn biết về việc thực thi hàm thì bạn sẽ biết rằng khi chúng ta gọi một hàm, phần định nghĩa sẽ thực thi và cuối cùng chúng ta yêu cầu câu lệnh trả về, do đó chúng ta có thể nói rằng trả về đến sau toàn bộ định nghĩa của hàm, đó là lý do tại sao nếu có hai hoặc nhiều chức năng cùng tên và cùng loại và không. của đối số thì tại thời điểm gọi trình biên dịch sẽ biết cái nào sẽ được gọi, vì tên hàm và các tham số giống nhau. Tại thời điểm gọi trước hết mọi sự tập trung sẽ là đối số và tên hàm và sau khi hoàn thành định nghĩa hàm cuối cùng chúng ta xử lý với câu lệnh return.
Lỗi thời gian biên dịch tốt hơn Lỗi thời gian chạy. Vì vậy, trình biên dịch java hiển thị lỗi thời gian trình biên dịch nếu bạn khai báo cùng một phương thức có các tham số giống nhau.
không, không thực sự có thể theo cách đó bạn chỉ có thể quá tải bởi không có đối số hoặc kiểu dữ liệu của đối số