[java] 여기에서 정수 리터럴을 (int)로 캐스팅해야하는 이유를 아십니까?

다음 예에서

int i = -128;
Integer i2 = (Integer) i; // compiles

Integer i3 = (Integer) -128; /*** Doesn't compile ***/

Integer i4 = (Integer) (int) -128; // compiles
Integer i4 = -128; // compiles
Integer i5 = (int) -128; // compiles
Integer i6 = (Integer) (-128); // compiles
Integer i7 = (Integer) 0-128; // compiles

나는 캐스팅 수 없습니다 -128(Integer)하지만 난 캐스트 할 수 있습니다 (int) -128.

난 항상 생각 -128이었다 int종류와 함께 캐스팅하는 것은 (int)중복해야합니다.

줄의 오류 i3

cannot find symbol variable Integer

Java 6 업데이트 29 및 Java 7 업데이트 1에서 이것을 시도했습니다.

편집 : +128대신 -128. 단항 연산자와 이항 연산자 사이의 혼동으로 보입니다.



답변

컴파일러는 뺄 시도 128에서 (Integer)대신 캐스팅의 -128Integer. ()그것을 수정하기 위해 추가

Integer i3 = (Integer) -128; // doesn't compile
Integer i3 = (Integer) (-128); // compiles

댓글에있는 BoltClock에 따르면 캐스트 int는 예약어이므로 식별자로 해석 할 수 없기 때문에 의도 한대로 작동합니다.

Bringer128은 JLS Reference 15.16을 찾았습니다 .

 CastExpression :
    (PrimitiveType Dims opt ) UnaryExpression
    (ReferenceType) UnaryExpressionNotPlusMinus

보시다시피 기본 유형으로 UnaryExpression캐스트 하려면 any가 필요 하지만 참조 유형으로 캐스트하려면 UnaryExpressionNotPlusMinus. 이것들은 JLS 15.15 의 CastExpression 직전에 정의되어 있습니다 .


답변

JLS 참조를 찾았습니다. 15.16 .

 CastExpression :
    (PrimitiveType Dims opt ) UnaryExpression
    (ReferenceType) UnaryExpressionNotPlusMinus

보시다시피 기본 유형으로 UnaryExpression캐스트 하려면 any가 필요 하지만 참조 유형으로 캐스트하려면 UnaryExpressionNotPlusMinus. 이것들은 JLS 15.15 의 CastExpression 직전에 정의되어 있습니다 .

캐스트를 기본 유형으로 변경해야합니다.

... (int) -128;

또는 캐스트 오른쪽에있는 표현식을 플러스 마이너스가 아닌 단항 표현식으로 변경할 수 있습니다.

... (Integer) (-128);  // Either
... (Integer) 0 - 128; // Or


답변

컴파일러 -는을 두 인수 빼기 연산자로 해석합니다 . 즉, 이름이 지정된 다른 숫자에서 128을 빼려고합니다.Integer , 하지만 범위에 그러한 변수가 없습니다.

이것은 다음을 컴파일합니다.

Integer i3 = (Integer) (-128)


답변

이것은 구문 분석과 관련이있을 수 있습니다. 그것을주의해라

Integer i4 = (Integer) (-128); 

잘 작동합니다.

일반적으로 Integer 클래스로 캐스트해서는 안됩니다. 여기에는 자동 박싱이라는 것이 포함되며 코드에 미묘한 오류가 발생할 수 있습니다. 원하는 작업을 수행하는 데 선호되는 방법은 다음과 같습니다.

Integer i6 = Integer.valueOf(-128)


답변

그것은 그것을 파싱 Integer <minus operator> 128하고 변수를 찾지 않습니다 Integer. 당신은 포장해야합니다 -128괄호 :

Integer i3 = (Integer) (-128);  // compiles


답변

Integer i3 = (Integer) (-128);

문제는 -컴파일러가 그것을 연산자로 본다는 것입니다.


답변

3 행은 괄호 안의 표현식에서 128을 빼려고하고 괄호 안의 표현식은 그렇지 않고 int 유형의 표현식이 아닌 것처럼 해석됩니다 ( ‘-‘를 ‘-‘연산자로 취급합니다). 표현식을 다음과 같이 변경하는 경우 :

Integer i3 = (Integer) (-128);

그러면 컴파일러는 ‘-‘가 음의 정수를 나타내는 단항 마이너스임을 이해할 것입니다.