자바를 배우고 오버로드에 관한 몇 가지 질문을 만났습니다. 예를 들어 다음 함수의 사용을 가지고 :Java에서 애매한 오버로딩
f('a', 'a');
을 우리가 두 개의 정의가있는 경우 : 그것은 확인 될 것입니다
static void f(int i, char j){
System.out.println("int_char");
}
static void f(double i, char j){
System.out.println("double_char");
}
합니다. 모든 두 번째 매개 변수가 정확히 일치하기 때문입니다. 그러나 첫 번째 매개 변수는 둘 다 사용됩니다. char의 순서를 넓히는 것은 다음과 같습니다.
char -> int -> long -> float -> double
int를 얻으려면 char이 1 단계가 필요합니다. 그러나 두 배를 달성하려면 4 단계가 필요합니다.
int_char
그러나 나는대로 paremeter의 순서를 변경 : 그래서 결과는 모호한 같은 오류를 제안 할 것입니다
static void f(int i, char j){
System.out.println("int_char");
}
static void f(char i, double j){
System.out.println("char_double");
}
컴파일러. 왜?
또 다른 경우는 다음과 같습니다 :
static void f(char i, Character j){
System.out.println("char_Character");
}
static void f(Character i, Character j){
System.out.println("Character_Character");
}
두 번째 매개 변수의 두
이 atuoboxing를 사용합니다. 그러나 void f (char i, Character j)의 첫 번째 매개 변수는 정확히 일치합니다. 왜이 두 기능이 모호하게 이어지는가? 이러한 기능의 사람이 하나를 follwing을 함께 나타나는 경우마지막 :
static void f(Character... i){
System.out.println("Character_varargs");
}
을> 권투를 확대하기 때문에 출력은하지 Character_varargs이다> 가변 인자. 그러나 두 모호한 함수가 Character_varargs와 같은 경우 :
static void f(char i, Character j){
System.out.println("char_Character");
}
static void f(Character i, Character j){
System.out.println("Character_Character");
}
static void f(Character... i){
System.out.println("Character_varargs");
}
결과는 Character_varargs가됩니다. 왜?
static void f(int i, char j){
System.out.println("int_char");
}
static void f(char i, double j){
System.out.println("char_double");
}
static void f(int i, double j){
System.out.println("int_double");
}
static void f(Character... i){
System.out.println("Character_varargs");
}
결과는 여전히 Character_varargs입니다 :
심지어 우리는 같은 일부 비 모호하고 우선 순위가 높은-에-과부하 기능을 추가 할 수 있습니다. 왜? void f (int i, double j)와 void f (Character ... i) 만 고려하면 출력은 int_double가되어야합니다.컴파일러가 모호한 함수를 만날 때 다른 후보를 고려하지 않고 직접 varargs 함수로 "점프"합니까?
감사합니다.
을 참조하십시오 일치하는 항목을 찾아, 세 번째 단계로 갈 필요 (넓히고 복싱/언 박싱 및 변수 인수) [JLS] (http://docs.oracle.com/javase/specs/jls/se7/html/index.html)에서 자세히 설명합니다. 이 부분을 철저히 조사 했습니까? –
@JimGarrison 죄송합니다. 방금 정확히 2 일 동안 Java를 배웠습니다. 나는 전에 그 자료를 정말로 모른다. 거기서 답을 찾으려고 노력 중입니다. 귀하의 제안에 감사드립니다. – Sheng