Javaでバイトリテラルをどのように指定しますか?


238

方法があるなら

void f(byte b);

キャストせずに数値引数で呼び出すにはどうすればよいですか?

f(0);

エラーが発生します。


1
@oliholzはダウンキャストで、解析のオーバーヘッドが追加されます
Ben Barkay

回答:


284

できません。基本的な数値定数は整数(または "L"が続く場合はlong)と見なされるため、明示的にバイトにダウンキャストしてパラメーターとして渡す必要があります。私の知る限り、近道はありません。


11
この種のことをたくさん行っている場合は、byte b(int i) { return (byte) i; }どこかに単純なヘルパーメソッドを定義して静的にインポートできます。次に、f(b(10))を記述できます。
Yona Appletree 2013年

125

あなたがキャストする必要があります、私は恐れています:

f((byte)0);

私はそれが実行時ではなくコンパイル時に適切な変換を実行すると信じていますので、それは実際にパフォーマンスのペナルティを引き起こすつもりはありません。それだけで不便です:(


11
コンパイル時変換の場合は+1。コンパイラを理解し、言語設計者を信頼することは常識ですが(それは私たちがすべきです)、それ以外はそれほど明白ではありません。
Philip Guin 2013年

31

Javaではバイトリテラルを使用できます。

    byte f = 0;
    f = 0xa;

0xa(intリテラル)は自動的にバイトにキャストされます。これは実際のバイトリテラルではありませんが(下記のJLSとコメントを参照)、アヒルのように鳴る場合は、アヒルと呼びます。

あなたができないことはこれです:

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 2014

すでにトリックを使用している場合。の静的インポートを使用してbyte b(int i){}、とb(1)同じくらい長く、トリッキーではありませんf=1
Elazar Leibovich

1
@smehmood、しかし変換はランタイムではなくプリコンパイラ/コンパイラ(プログラムが実行を開始する前に)によって行われるので、それはリテラルではありませんか?
Pacerier 2014

2
@Pacerierリテラルです。「バイトリテラル」ではありません。intです。コンパイラーはそれを(必要に応じて)intリテラルとして扱い、割り当てでも暗黙的にダウンキャストします(必要に応じて)。「バイトリテラル」(存在しない)として解析されることはありません。変換の絞り込みについては、特にJLSセクション5.2の後半を参照してください。関係するのは整数定数と、バイト変数への適切な割り当て変換ルールの適用だけです。
Jason C、

この答えは+1です。この手法は斬新ですが、Javaには「バイトリテラル」はありません。

12

コードでリテラルを渡す場合、事前にそれを宣言することを妨げているのは何ですか?

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

1
これにより、値にセマンティックな名前を付けることもできます。en.wikipedia.org/wiki/...
アーロン・J・ラング

これは便利です。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これはコードの可読性にとって非常に悪いです。また、バイトが保持できるよりも高い値を実際に渡そうとすると、問題が発生する可能性があります。この方法を使用しないようにしてください。
ロルフツ

3
また、このキャストは実行時に行われます。ひどい。
BrainSlugs83 2015

Rolf(Tsu)に完全に同意することは、技術的にはオーバーロードではなくオーバーロードであることを追加する価値があるでしょう。
Cromax

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.