2

一部のコードでは、次のように表示されます。

private void compute(Long a, Long b, Long c) {
        long result = a-(b+c);
...

結果がオペランドに対応するLongオブジェクトではなく、プリミティブなlongに格納されるのは少し奇妙に思えます。

結果をプリミティブとして保存する必要がある理由はありますか?

4

9 に答える 9

1

算術演算子 + および - は、ボックス化された型 (Long など) ではなく、プリミティブ型 (long など) に対して定義されています。

結果もロング。オートボクシングとアンボクシングのチュートリアルを見る

これを Long に自動ボックス化すると、わずかなパフォーマンス コストが発生します。それも不要なので

  1. null ではないことがわかっています (a、b、または c が null の場合、NullPointerException が発生します)。
  2. 後で Long が必要な場所で使用すると、暗黙的に自動ボックス化されます。
于 2013-05-31T11:05:08.620 に答える
0

通常、プリミティブを使用することをお勧めします。特に、プリミティブが null にならないことが確実な場合はそうです。ボックス化された型の使用を主張する場合は、null の場合に何が起こるかを常に考えてください。Java は自動的にボックス化とボックス化解除を行いますが、int をじっと見て、なぜ NullPointerException が発生したのか疑問に思うのは楽しいことです。

于 2013-05-31T10:34:09.293 に答える
0

Java 1.5 以降では、必要に応じてオートボクシングとアンボクシングが暗黙的に行われます。

于 2013-05-31T10:34:31.533 に答える
0

次の行:

long result = a-(b+c);

Long...3 を使用して式の結果を取得し、それをプリミティブな long に格納するように Java に要求します。Java 5 より前は、型が一致しないと文句を言っていましたが、最近では、あなたが言っていることを意味していると仮定して、オブジェクトからプリミティブ型への変換を自動的に行います。

ただし、この例では、ここに記載されていない他の正当な理由がない限り、最初からパラメーターをボックス化されたオブジェクト型として使用しても意味がありません。

于 2013-05-31T10:48:36.747 に答える
0

に従ってjavadoc

Boxing conversion converts expressions of primitive 
type to corresponding expressions of reference type. 
Specifically, the following nine conversions are called the boxing conversions:

From type boolean to type Boolean

From type byte to type Byte

From type short to type Short

From type char to type Character

From type int to type Integer

From type long to type Long

From type float to type Float

From type double to type Double

From the null type to the null type


Ideally, boxing a given primitive value p, would always yield an identical reference.     
In practice, this may not be feasible using existing implementation techniques. The  
rules above are a pragmatic compromise. The final clause above requires that certain 
common values always be boxed into indistinguishable objects. The implementation may  
cache these, lazily or eagerly. For other values, this formulation disallows any 
assumptions about the identity of the boxed values on the programmer's part. This would 
allow (but not require) sharing of some or all of these references.

This ensures that in most common cases, the behavior will be the desired one, without     
imposing an undue performance penalty, especially on small devices. Less memory-limited 
implementations might, for example, cache all char and short values, as well as int and 
long values in the range of -32K to +32K.`

これがOracleドキュメントのソースです

于 2013-05-31T10:58:36.223 に答える