java class operator overloading




왜 Java의+=,-=,*=,== 복합 할당 연산자가 형 변환을 요구하지 않습니까? (7)

오늘까지, 나는 예를 들면 그것을 생각했다 :

i += j;

바로 가기에 불과했습니다.

i = i + j;

그러나 우리가 이것을 시도한다면 :

int i = 5;
long j = 8;

그러면 i = i + j; 컴파일하지는 않지만 i += j; 잘 컴파일됩니다.

사실 i += j; 이런 식의 바로 가기입니다 i = (type of i) (i + j) ?


Java 유형 변환 작업은 할당 연산의 오른쪽에있는 표현식 유형이 할당의 왼쪽에있는 변수 유형으로 안전하게 승격 될 수있을 때 자동으로 수행됩니다. 따라서 우리는 안전하게 할당 할 수 있습니다 :

 byte -> short -> int -> long -> float -> double. 

같은 방식으로 다른 방식으로 작동하지 않습니다. 예를 들어 long이 int로 자동 변환 할 수없는 이유는 첫 번째가 두 번째보다 많은 저장 공간을 필요로하고 결과적으로 정보가 손실 될 수 있기 때문입니다. 그러한 변환을 강제하기 위해서는 명시 적 변환을 수행해야합니다.
유형 - 전환


가장 큰 차이점은 a = a + b 하면 형변환이 수행되지 않으므로 컴파일러가 형변환을하지 않으면 화를 낼 수 있다는 것입니다. 그러나 a += b 하면 실제로 수행중인 작업은 b 와 호환되는 형식으로 b 를 typecasting a 입니다. 그래서 네가한다면

int a=5;
long b=10;
a+=b;
System.out.println(a);

당신이 정말로하고있는 것은 :

int a=5;
long b=10;
a=a+(int)b;
System.out.println(a);

아주 좋은 질문입니다. Java 언어 스펙이 사용자의 제안을 확인합니다.

예를 들어 다음 코드는 정확합니다.

short x = 3;
x += 4.6;

x가 7과 같기 때문에 x 값이 7이됩니다.

short x = 3;
x = (short)(x + 4.6);

언제나이 질문에, JLS 응답을 보유하십시오. 이 경우 §15.26.2 복합 할당 연산자 . 추출물 :

E1 op= E2 형식의 복합 할당 표현식은 E1 = (T)((E1) op (E2)) 와 동일합니다. 여기서 TE1 이 한 번만 평가된다는 점을 제외하고 E1 의 유형입니다.

§15.26.2 에서 인용 한 예

[...] 다음 코드는 정확합니다.

short x = 3;
x += 4.6;

x가 7과 같기 때문에 x 값이 7이됩니다.

short x = 3;
x = (short)(x + 4.6);

즉, 귀하의 가정은 정확합니다.


여기서 미묘한 점 ...

j 가 double이고 i 가 int 인 경우 i+j 대한 암시 적 타입 변환이 있습니다. Java는 항상 정수를 double로 변환합니다.

i+=j 를 명확히하기 위해 i+=j 는 정수이고 j 는 double입니다.

i = <int>(<double>i + j)

참고 : 암시 적 주조에 대한 설명

이 경우 명확하게하기 위해 j(int) 로 유형 변환해야 할 수 있습니다.


예,

기본적으로 우리가 쓸 때

i += l; 

컴파일러는 이것을 다음으로 변환한다.

i = (int)(i + l);

방금 .class 파일 코드를 확인했습니다.

알아두면 좋은 것


i = i + l 경우에는 explicitly long 에서 int 로 형변환해야합니다. 그러면 컴파일되고 올바른 결과가 제공됩니다. 처럼

i = i + (int)l;

또는

i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.

하지만 += 경우에는 연산자가 암시 적으로 오른쪽 변수의 형식에서 왼쪽 변수의 형식으로 형식 변환을 수행하므로 명시 적으로 캐스팅 할 필요가 없기 때문에 += 잘 작동합니다.





assignment-operator