JVM quyết định phương thức quá tải nào cần gọi lúc biên dịch. Tôi có một ví dụ:Cách JVM tìm phương thức (tham số có đối sánh gần nhất) để gọi trong trường hợp quá tải hàm
public class MainClass{
public static void go(Long n) {System.out.println("takes Long ");}
public static void go(Short n) {System.out.println("takes Short ");}
public static void go(int n) {System.out.println("takes int ");}
public static void main(String [] args) {
short y = 6;
long z = 7;
go(y);
go(z);
go((Short)y);
}
}
Theo hiểu biết của tôi, nó nên in như sau:
takes Short
takes Long
takes Short
... nhưng sản lượng thực tế là:
takes int
takes Long
takes Short
Tuy nhiên nếu tôi có ba chức năng sau:
public static void go(Integer n) {System.out.println("takes Integer");}
public static void go(Long n) {System.out.println("takes Long ");}
public static void go(Short n) {System.out.println("takes Short ");}
... và gọi nó là sử dụng:
int a= 10; and go(i); //output : takes Integer.
... tại sao lại có có sự khác biệt cho short
và int
?
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.4 – kosa
có thể trùng lặp http://stackoverflow.com/ q/6268157/2087187 – EProgrammerNotFound