정수 리터럴을 (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)
-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가 필요 하지만 참조 유형으로 캐스트하려면 a가 필요합니다 UnaryExpressionNotPlusMinus
. 이것들은 JLS 15.15 의 CastExpression 직전에 정의됩니다 .
JLS 참조를 찾았습니다. 15.16 .
CastExpression : (PrimitiveType Dims opt ) UnaryExpression (ReferenceType) UnaryExpressionNotPlusMinus
보시다시피 기본 유형으로 UnaryExpression
캐스트 하려면 any가 필요 하지만 참조 유형으로 캐스트하려면 a가 필요합니다 UnaryExpressionNotPlusMinus
. 이것들은 JLS 15.15 의 CastExpression 직전에 정의됩니다 .
캐스트를 기본 유형으로 변경해야합니다.
... (int) -128;
또는 캐스트 오른쪽의 표현식을 더하기 빼기 단항 표현식으로 변경할 수 있습니다.
... (Integer) (-128); // Either
... (Integer) 0 - 128; // Or
컴파일러 -
는 2를 빼는 빼기 연산자로 해석합니다 . 즉라는 다른 숫자에서 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);
문제는 -
컴파일러가 그것을 연산자로 본다는 것입니다.
Line 3 is interpreted like you're trying to deduct 128 from the expression in the parenthesis and the expression in the parenthesis is not and expression of type int (It treats the '-' as a '-' operator). If you change the expression to:
Integer i3 = (Integer) (-128);
then the compiler will understand the '-' is the unary minus that indicates a negative integer.
The C# compiler has the same behaviour. It gives a better hint why it fails to compile though:
To cast a negative value, you must enclose the value in parentheses
'Programing' 카테고리의 다른 글
Oracle SQL Developer에서 언어를 영어로 변경하려면 어떻게해야합니까? (0) | 2020.07.11 |
---|---|
두 날짜 사이의 시간 차이를 초 단위로 가져옵니다. (0) | 2020.07.11 |
Django : 템플릿 내에서 세션 변수에 액세스하십니까? (0) | 2020.07.11 |
파이썬에서 경로가 크로스 플랫폼 방식으로 절대 경로인지 상대 경로인지 확인하는 방법은 무엇입니까? (0) | 2020.07.11 |
Content-Type 헤더에 관계없이 Python Flask에서 원시 POST 본문 가져 오기 (0) | 2020.07.11 |