短い値のJavaの設定


114

J2MEで小さなコードを書いています。メソッドを持つクラスがありsetTableId(Short tableId)ます。今、私が書こうとするsetTableId(100)と、コンパイル時にエラーが発生します。別の短い変数を宣言せずに短い値を設定するにはどうすればよいですか?

Long値を設定するときに使用できsetLongValue(100L)、機能します。それでは、Lここで何を意味し、Short価値の性質は何ですか?

ありがとう


Llongリテラルを示すために使用される単なる接尾辞です。
missingfaktor

回答:


174

Javaでは、整数リテラルはデフォルトでint型です。他のいくつかのタイプについては、次のような大文字と小文字を区別しない文字でリテラルをサフィックスもLDFそれぞれ、長い、ダブル、またはfloatを指定します。読みやすくするために大文字を使用するのが一般的であることに注意してください。

Java言語仕様では、byte型またはshort型に同じ構文糖衣を提供していません。代わりに、明示的なキャストを使用して、そのように宣言できます。

byte foo = (byte)0;
short bar = (short)0;

あなたにはsetLongValue(100L)、メソッド呼び出し、あなたは、必ずしもする必要はありませんL。この場合はint型のリテラルは自動的に長いに拡大されるため、接尾辞を。これは、Java言語仕様では拡張プリミティブ変換と呼ばれています。


16
他のタイプのサフィックスもあります:d/ Dはa doubleを作り、f/ Fはfloatを作ります!
Joachim Sauer

6
また、サイズに収まるリテラルをキャストする必要はありません。2つの例はキャストなしでも機能します。
Joachim Sauer

あなたは両方に正しいです。ここでは、整数リテラルについて話しているのではなく、浮動小数点リテラルについて話していることをもっと明確にすべきでした。
ラウリ

4
@Joachim:J5 +にのみキャストは必要ありません。J2MEは残念ながらまだJ4にあります(J4を大幅に削減)。
ローレンスドル

2
@JoachimSauer、「サイズに合わせる」とはどういう意味ですか?0は短いのに、エラーを回避するために具体的にキャスト0しなければならなかったので、私は尋ねています。(short)0possible lossy conversion from int to short
Ryvantage 2016年

34

バイトや短いリテラルなどはありません。あなたは使用してショートにキャストする必要があります(short)100


9

通常は、変数をキャストしてになることができますshort

混乱を招く可能性のあるこのような問題も発生する可能性があります。これは、+オペレーターがそれらをint

ここに画像の説明を入力してください

要素をキャストしても役に立たない:

ここに画像の説明を入力してください

式をキャストする必要があります:

ここに画像の説明を入力してください


1
short + short = intになる理由があることを忘れないでください。2つのショートの合計がマシンの最大ショート値よりも大きい場合、それをショートにキャストすると、languajeでサポートされている場合、予期しない結果が生じるか、例外がスローされます。
DGoiko

2
そのロジックでは、2つのintを追加するとlongが返されます;)
マットは

1
そして、私の合計がInteger.MAX_VALUEを超えることができるかどうかを探します。私はintを返す決定(おそらくHWが実際に合計を実行する方法に関連している)の決定を擁護しているのではありません。おそらく関係する数値のサイズが原因で、intをキャッピングするよりも短いキャパシティーをキ​​ャッピングするバグが多く発生しました。ショートキャップ用の2 tinyバイトのJava
リザーバーが

1
コメントをもう一度読みましたが、私は自分の主張を明確にしませんでした。最初の文は紛らわしく、私はそれを言わずに残りを残しておくべきでした、2つの関連するステートメントがあるように見えます.short + shortがintである理由は、docs.oracle.com / javase / specs / jvms / se8 / html /…、JVMには略して合計操作はありません。Javaのintは32ビットであり、この決定がなされたとき、ほとんどのコンピューターは32ビットだったので、intは最高のアイデアのように見えたと思います。
DGoiko

1
また、ここで説明したstackoverflow.com/a/27123302/9465588のように、JVMは実際にはクラスフィールドごとにその仮想メモリ空​​間の少なくとも32ビットを処理したため、短いフィールドを宣言してもメモリは節約されません。Javaがこれを変更したかどうかはわかりません。DAOのようにテレの外部の制限がない限り、短い値を使用しない傾向があります
DGoiko

8

使用できますsetTableId((short)100)。これはJava 5で変更されたと思います。バイトまたはshortに割り当てられ、ターゲットの範囲内に割り当てられた数値リテラルは、自動的にターゲットタイプであると見なされます。ただし、最新のJ2ME JVMはJava 4から派生しています。


PS:J2MEのコーディングに悩む中年の悩みへようこそ。ハンドヘルドデバイスが最大2000年のデスクトップをキャッチするのを待ちきれません。
Lawrence Dol 2010

3
何の「J4」(なし「J5」はありませんJavaは、それ以上、それはすでにあるよりも、混乱命名方式/バージョン管理しないでください。。
ヨアヒム・ザウアー

2
@Joachim:Java 1、Java 2、Java 5、Java 6、Java 7はよく知られており、そのように呼ばれています。Java 3とJava 4が何を意味するかを推測することはそれほど難しくありません。「Jn」は単に明白なものの略語です。Sunの現在の(できれば最終的な)命名法をすべてのバージョンに採用することで、混乱を減らすことができます。
Lawrence Dol、

2
@Joachim:この件に関するSunの最後の言葉によると、先頭の「1」。「1.x」のJavaは、議論中のバージョンを参照する場合には存在しないかのように扱われ、互換性のためだけにJVMによって発行されたバージョンで保持されます。したがって、Java 2は、以前はJ2SEが元々あった1.2として知られていたバージョンです(同時に、SunはJ2xEではなく、JavaEE、JavaSE、およびJavaMEの使用を推奨していません)。つまり、1.3はJava 3、1.4はJava 4、1.5はJava 5、1.6はJava 6、1.7はJava 7です。真剣に、これはそれほど難しいことではありません。
Lawrence Dol

2
「1」。ただけのJava 5以降でのカット。Java 1.0-1.4は常に Sunによってその名前で参照されます。また、Sunは「Java 2」を使用してJava 1.2からJava 1.5 / Java 5までを参照しているため、意図的に行われています。これは非常に混乱しますが、Sunが使用しなかった新しい名前を発明しても、簡単にはなりません。
Joachim Sauer、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.