왜 여기에 정수 리터럴을 넣어야 하는지 아세요?
다음 예제에서는
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로 시도했습니다.
EDIT: 같은 동작을 얻을 수 있습니다.+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: (PrivitiveType Dimsopt) UnaryExpression( 참조 유형) UnaryExpressionNotPlusMinus
보다시피, 원시적인 타입으로 캐스팅하려면UnaryExpression
단, 레퍼런스 타입에 캐스팅하려면UnaryExpressionNotPlusMinus
이것들은 JLS 15.15의 CastExpression 직전에 정의되어 있습니다.
JLS 자료를 찾았어요 15.16
CastExpression: (PrivitiveType Dimsopt) UnaryExpression( 참조 유형) UnaryExpressionNotPlusMinus
보다시피, 원시적인 타입으로 캐스팅하려면UnaryExpression
단, 레퍼런스 타입에 캐스팅하려면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);
문제는-
컴파일러는 연산자로 인식합니다.
3행은 괄호 안의 식에서 128을 빼려는 것으로 해석되고 괄호 안의 식과 int 유형의 식('-'을 '-' 연산자로 취급합니다).식을 다음과 같이 변경할 경우:
Integer i3 = (Integer) (-128);
그러면 컴파일러는 '-'가 음의 정수를 나타내는 단항 마이너스라는 것을 이해할 것입니다.
C# 컴파일러에서도 같은 동작이 발생합니다.컴파일에 실패하는 이유를 알 수 있습니다.
음수 값을 캐스팅하려면 값을 괄호로 묶어야 합니다.
언급URL : https://stackoverflow.com/questions/7900198/any-idea-why-i-need-to-cast-an-integer-literal-to-int-here
'programing' 카테고리의 다른 글
Jackson: 필드 직렬화를 방지하는 방법 (0) | 2022.09.03 |
---|---|
Maven 환경 변수 (0) | 2022.09.03 |
서브클래스는 개인 필드를 상속합니까? (0) | 2022.08.29 |
Vue.js : Vuex의 상태 속성 데이터는 얼마나 지속됩니까? (0) | 2022.08.29 |
Javescript는 어레이에서 요소를 자동으로 제거합니다. (0) | 2022.08.29 |