2012-11-07 2 views
4

Java에서 매개 변수가 double a 인 함수가 있다고 가정합니다. 인수로 정수를 전달하면 작동합니까? (내 말은 암시 적 변환이 있습니까?) 그리고 반대의 경우 : 만약 내가 가지고 있다면. 매개 변수로 정수, 그리고 이중 전달합니까?Java : 함수에 다른 형식의 인수 전달

불행히도 현재 코드를 컴파일 할 수 없으므로이 코드를 확인하고 싶습니다. 감사합니다.

+3

double 형 대신 int를 전달합니다. double 대신 float을 전달하면됩니다. 둘 중 하나 대신 이중을 건네 줘? 아니 아니 아니 아니. – Clark

+0

나는 자바가 이것에 대해 더 "유연한"것이 었으면 좋겠다고 생각했다. :) – Pippo

답변

10

Method Invocation Conversion에 대한 자세한 내용은 JLS - Section # 5.3을 참조하십시오.

- an identity conversion (§5.1.1) 
- a widening primitive conversion (§5.1.2) 
- a widening reference conversion (§5.1.5) 
- a boxing conversion (§5.1.7) optionally followed by widening reference conversion 
- an unboxing conversion (§5.1.8) optionally followed by a widening primitive conversion. 

그래서, 첫 번째 호출 ( doubleint가) 규칙 # 2에 따라 잘 작동합니다 :

메소드 호출 컨텍스트는 다음 중 하나를 사용할 수 있습니다.

그러나 두 번째 호출 (intdouble), 컴파일러 오류을 제공 같은 부분에서 더 인용 한 성명에 따라 것입니다 : -

는 식의 유형은 유형으로 변환 할 수없는 경우 매개 변수의 메서드 호출 컨텍스트에서 허용되는 변환 이면 컴파일 타임 오류가 발생합니다.

+0

답장을 보내 주셔서 감사합니다! – Pippo

1

때때로 함수에 Number의 매개 변수를 지정하면이 문제를 해결할 수 있습니다. 이것은 IntegerDouble이 상속하는 객체이므로 Double 숫자와 Integer 숫자가 똑같이 작동하는 지점까지이 작업이 가능합니다.

integerdouble과 개체 IntegerDouble 사이에는 차이점이 있습니다. Java는 자동 호출을 사용하여 함수 호출 등에서 이러한 유형을 자동으로 변환합니다.

+0

네,'rule # 4'에 따라 작동합니다. boxing 후,'Integer'에서'Double'까지 넓힐 수는 없습니다. 왜냐하면'Integer'의 수퍼 타입이 아니기 때문에'Number'를 사용해야합니다. –

1

double을 정수로 설정할 수 있으므로 인수로 정수를 사용하면 double을 매개 변수로 사용하는 것이 좋습니다. 다른 방법은 실패합니다. 이 경우 double을 int로 변환해야합니다. 예 : 일반 할당자에게도 적용됩니다. 예 :

int i = 6; 
    double d = 0; 
    d = i; /* ok 
    i = d ; /* not ok