2013-10-03 2 views
3

자바를 배우고 오버로드에 관한 몇 가지 질문을 만났습니다. 예를 들어 다음 함수의 사용을 가지고 :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 함수로 "점프"합니까?

감사합니다.

+1

을 참조하십시오 일치하는 항목을 찾아, 세 번째 단계로 갈 필요 (넓히고 복싱/언 박싱 및 변수 인수) [JLS] (http://docs.oracle.com/javase/specs/jls/se7/html/index.html)에서 자세히 설명합니다. 이 부분을 철저히 조사 했습니까? –

+0

@JimGarrison 죄송합니다. 방금 정확히 2 일 동안 Java를 배웠습니다. 나는 전에 그 자료를 정말로 모른다. 거기서 답을 찾으려고 노력 중입니다. 귀하의 제안에 감사드립니다. – Sheng

답변

2

바둑> varargs가 정확하지 않습니다.

적절하게 확대> 복싱 및 박스 해제> 확대 및 복싱/박스 해제 및 varargs 모두.

세 번째 단계에서는 세 가지 모두 허용됩니다.

static void f(int i, char j){ 
    System.out.println("int_char"); 
} 

static void f(double i, char j){ 
    System.out.println("double_char"); 
} 

위의 경우 특정 인수가 1 인 경우 확대 거리를 기준으로 우선 순위에 따라 정렬 할 수 있습니다. 그러나 아래에서는 그들을 배치 할 수 없습니다.

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"); 
} 

, 또는 첫 번째 또는 두 번째 복싱 않고 모든 방법 (권투없이 일치 없었다로) 인수는 동일한 선호도로 취급됩니다. 따라서 첫 번째 코드는 두 번째 코드보다 좋지 않으므로 우선 순위에 따라 정렬 할 수 없습니다. 모호한 것으로 이어진다. 어떠한 적절한 방법이 발견 된 이후 지금 아래 경우

는 또한 규칙으로 당

static void f(Character... i){ 
    System.out.println("Character_varargs"); 
} 

존재 복싱/언 박싱 그래서 세번째 단계가 VAR의 인수에 필요한 후 (모호한 2 나타났다). 마침내 해결할 방법을 찾습니다. 아래의 경우


또한 우리는이 모든 설명

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"); 
} 

https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12