programing

왜 여기에 정수 리터럴을 넣어야 하는지 아세요?

yoursource 2022. 9. 3. 14:18
반응형

왜 여기에 정수 리터럴을 넣어야 하는지 아세요?

다음 예제에서는

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

반응형