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.