Java에서 바이트 리터럴을 어떻게 지정합니까?


238

내가 방법이 있다면

void f(byte b);

캐스팅하지 않고 숫자 인수로 어떻게 호출 할 수 있습니까?

f(0);

오류가 발생합니다.


1
추가 구문 분석 오버 헤드로 다운 캐스팅되는
— @oliholz

답변:


284

당신은 할 수 없습니다. 기본 숫자 상수는 정수 (또는 "L"뒤에 오는 경우 긴 정수)로 간주되므로이를 바이트로 명시 적으로 다운 캐스트하여 매개 변수로 전달해야합니다. 내가 아는 한 바로 가기가 없습니다.


11
이런 종류의 일을 많이하는 경우 간단한 도우미 메서드를 정의 byte b(int i) { return (byte) i; }하고 정적으로 가져올 수 있습니다. 그런 다음 f (b (10))를 쓸 수 있습니다.
— Yona Appletree

125

당신은 캐스팅해야합니다.

f((byte)0);

실행 시간 대신 컴파일 타임에 적절한 변환을 수행 하므로 실제로 성능 저하를 초래하지는 않습니다. 그것은 단지 불편합니다 :(


11
컴파일 타임 변환의 경우 +1 컴파일러를 이해하고 언어 디자이너 (우리가해야 할 것)를 믿지만 그렇지 않은 경우에는 상식입니다.
— Philip Guin

31

자바에서 바이트 리터럴을 사용할 수 있습니다.

    byte f = 0;
    f = 0xa;

0xa(int literal)은 자동으로 바이트로 캐스트됩니다. 실제 바이트 리터럴이 아니지만 (아래 JLS 및 주석 참조) 오리처럼 cks 경우 오리라고 부릅니다.

당신이 할 수없는 것은 이것입니다 :

void foo(byte a) {
   ...
}

 foo( 0xa ); // will not compile

다음과 같이 캐스팅해야합니다.

 foo( (byte) 0xa ); 

그러나 이것들은 모두 컴파일되고 "바이트 리터럴"을 사용한다는 것을 명심하십시오.

void foo(byte a) {
   ...
}

    byte f = 0;

    foo( f = 0xa ); //compiles

    foo( f = 'a' ); //compiles

    foo( f = 1 );  //compiles

물론 이것도 컴파일

    foo( (byte) 1 );  //compiles

17
이것들은 바이트 리터럴이 아닙니다. 그것들은 암시 적으로 바이트로 변환되는 다양한 다른 유형 (주로 대부분)의 리터럴입니다. 예를 들어 1int 리터럴이지만 double d = 1;잘 컴파일됩니다.
— smehmood

이미 트릭을 사용하고 있다면. 정적 가져 오기를 수행 byte b(int i){}한 다음 b(1)보다 길고 덜 까다 롭습니다 f=1.
— Elazar Leibovich

1
@ smehmood, 그러나 변환은 런타임이 아닌 사전 컴파일러 / 컴파일러 (프로그램이 실행되기 전에)에 의해 수행되므로 문자 그대로입니까?
— Pacerier

2
@Pacerier 리터럴입니다. "바이트 리터럴"이 아닙니다. 정수입니다. 컴파일러는이를 그대로 int 리터럴로 취급하고 할당에서 암시 적 다운 캐스트 (필요한대로)를 수행합니다. "바이트 리터럴"(존재하지 않음)로 구문 분석되지 않습니다. 축소 변환에 대해서는 JLS 섹션 5.2 , 특히 후반을 참조하십시오 . 정수 상수와 바이트 변수에 적절한 할당 변환 규칙을 적용하는 것만 관련됩니다.
— Jason C

이 기술은 참신하기 때문에이 대답에 +1을 주었지만 실제로 Java에는 "바이트 리터럴"이 없습니다.

12

코드에 리터럴을 전달하는 경우 단순히 미리 선언하지 못하는 이유는 무엇입니까?

byte b = 0; //Set to desired value.
f(b);

1
또한 값에 더 의미적인 이름을 지정할 수 있습니다. en.wikipedia.org/wiki/…
— Aaron J Lang

유용합니다. java의 'fill'메서드를 사용하여 바이트 배열을 채우려 고하면 이것이 가장 합리적입니다.

그러나 컴파일러는 방금 다음에 대해 불평했고, 캐스트를 추가해야했습니다. public static final byte BYTE_MASK = ( byte )0xff;
— Marvo

그리고 실제로 byte BYTE_MASK = 0x000000ff;불확실한 부호 확장 버그를 얻지 않기를 원했습니다 .
— Marvo

5

메소드를 재정의하는 것은 어떻습니까?

void f(int value)
{
  f((byte)value);
}

이것은 허용합니다 f(0)


26
-1 코드 가독성이 매우 나쁩니다. 사람들이 실제로 바이트보다 높은 값을 전달하려고 할 때 문제가 발생할 수 있습니다. 사람들이이 방법을 사용하지 않는 것이 좋습니다!
— Rolf ツ

3
또한이 캐스트는 런타임에 발생합니다. 아주 나쁜.
— BrainSlugs83

Rolf (Tsu)에 완전히 동의하면 재정의하지 않고 기술적으로 과부하가 걸리는 가치가 있습니다.
— Cromax

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.