다음 예에서
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)
대신 캐스팅의 -128
에 Integer
. ()
그것을 수정하기 위해 추가
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);
그러면 컴파일러는 ‘-‘가 음의 정수를 나타내는 단항 마이너스임을 이해할 것입니다.