Tất cả câu trả lời cho biết JVM không cho phép điều này sai trái. Bạn có thể quá tải dựa trên loại trả lại. Đáng ngạc nhiên, JVM không cho phép điều này; đó là các trình biên dịch cho các ngôn ngữ chạy trên JVM không cho phép điều này. Nhưng có nhiều cách để vượt qua giới hạn trình biên dịch trong Scala.
Ví dụ, hãy xem xét các đoạn mã sau đây:
object Overload{
def foo(xs: String*) = "foo"
def foo(xs: Int*) = "bar"
}
này sẽ ném một lỗi biên dịch (Bởi vì varargs, chỉ định bởi các *
sau kiểu lập luận, gõ xóa để Seq
):
Error:(217, 11) double definition:
def foo(xs: String*): String at line 216 and
def foo(xs: Any*): String at line 217
have same type after erasure: (xs: Seq)String
def foo(xs: Any*) = "bar";
Tuy nhiên, nếu bạn thay đổi giá trị của số thứ hai foo
thành 3
thay vì bar
(cách đó thay đổi loại trả về từ String
thành Int
) như sau:
object Overload{
def foo(xs: String*) = "foo"
def foo(xs: Int*) = 3
}
... bạn sẽ không nhận được một lỗi biên dịch.
Vì vậy, bạn có thể làm một cái gì đó như thế này:
val x: String = Overload.foo()
val y: Int = Overload.foo()
println(x)
println(y)
Và nó sẽ in ra:
3
foo
Tuy nhiên, sự báo trước cho phương pháp này là có thêm varargs là cuối cùng (hoặc chỉ) đối số cho các hàm bị quá tải, mỗi hàm có kiểu riêng biệt của chúng.
Nguồn: http://www.drmaciver.com/2008/08/a-curious-fact-about-overloading-in-scala/
Xem thêm Java cụ thể http://stackoverflow.com/questions/2744511/java-why-no-return-type-based-method-overloading?lq=1 – nawfal
và nói chung http : //stackoverflow.com/questions/442026/function-overloading-by-return-type – nawfal