26

この質問は、「オートボクシングが Java で一部の呼び出しを曖昧にするのはなぜですか?」に関するものです。

しかし、回答を読んでみると、キャスティングに関する言及が数多くあり、その違いを完全に理解しているかどうかはわかりません。

誰かが簡単な説明を提供できますか?

4

7 に答える 7

40

ボクシングはプリミティブ型を参照型に変換するときであり、アンボクシングはその逆です。キャストとは、プリミティブ型と参照型の間で、ある型を別の型として扱う場合に、暗黙的または明示的なボックス化操作を意味します。明示的である必要があるかどうかは、言語の機能です。

于 2009-02-01T22:01:47.713 に答える
28

キャストとボックス化/ボックス化解除はどちらも型と見かけの (または実際の) 変換に関係していますが、ボックス化/ボックス化解除はプリミティブ型とそれに対応するラッパー型との関係に固有のものであり、キャストは型の明示的または暗黙的な変更を表す用語です。より一般的な意味。

キャスティングは、2 つの関連するが異なる意味を持つ一般的な用語です。

  1. ある型の値を別の型の値であるのように扱う。この最初の使用法の 2 つの例は次のとおりです。

    1.1。Bclass が class を拡張することを考えると、 のインスタンスへの参照が表示される可能性のある場所に書き込むことで、 のインスタンスを のインスタンスとして処理するようにA要求できます。これは、実際には の新しいインスタンスを生成しません。myBBA((A) myB)AA

    1.2. Java5 より前のコレクションでは、すべてのコンテンツがObject;として保存されていました。これには通常、コレクションからオブジェクトを取得した後にキャストを使用する必要がありました。たとえば、 aStringを a に格納していてMap、その長さを取得する必要がある場合、 のメソッド((String) myMap.get(someKey)).length()を呼び出すためにキャストが必要な場所のようなものを記述します。繰り返しますが、これによって新しい が作成されることはありません。lengthStringString

  2. ある型を別の型に明示的に変換する(つまり、表現を明示的に変更する)。この 2 番目の使用例は、((int) (float_var + 0.5F))0.5 を加算して浮動小数点変数を丸め (浮動小数点値を生成)、その値を明示的に整数に変換する式にあります。結果の整数値 ((int)キャスト後) は、内部計算によって他の値から生成されます。

キャストは、スーパークラス/サブクラスまたはインターフェイス/実装者の関係がある場合 (上記の 1 を意味します)、または 2 つの型がプリミティブ数値型である場合 (2 を意味します) に実行できます。詳細については、「拡大」と「縮小」を参照してください。

ボックス化とは、コンテナー オブジェクトにプリミティブ型をラップすることを指します。通常は、オブジェクトが必要な場合 (コレクションに値を格納する場合など) にのみ行われます。プリミティブ型とラッパー型はペアになっています。

int      Integer
long     Long
boolean  Boolean
...      ...

ボックス化解除とは、オブジェクト ラッパー内からプリミティブ値を取得することを意味します。

Java5 の時点で、対応するラッパー型が必要なプリミティブ値を使用する式を記述すると (整数をコレクションに入れるなど)、コンパイラーは自動的にそのプリミティブ値を実際にラップするコードを組み込みます。同様に、ラップ解除コードを提供します。

したがって、(Java5より前に)次のように書く代わりに:

Map myMap = new HashMap();
...
myMap.put(someKey,Integer.valueOf(3));
...
int nextValue = (myMap.get(someKey)).intValue() + 1;

あなたは書ける:

Map<KeyType,Integer> myMap = new HashMap<KeyType,Integer>();
...
myMap.put(someKey,3);
...
int nextValue = myMap.get(someKey) + 1;

ボックス化/ボックス化解除コードはコンパイラによって挿入されます。

于 2009-02-01T22:46:03.257 に答える
8
List<String> list = (List<String>)object;

キャストです。

void doSomething(Integer i) { ... }
...
doSomeething(5);

オートボクシングです。

Integer getSomething();
...
int i = getSomething();

自動開封です。

于 2009-02-01T21:56:58.567 に答える
4

次のようなコードを防止するために、Java 5 でオートボクシングが導入されました。

map.put("ABC", new Integer(5));
map.put("DEF", new Integer(6));

あなたは今言うことができます:

map.put("ABC", 5);

その方が簡単ですが、何をしているのか完全に確信が持てない場合、いくつかの落とし穴があります。

于 2009-02-01T22:01:25.483 に答える
0

次の場合、Autoboxing と Unboxing を適用できますか?

Long one = 10;
long two = 15;
Long three = 20;

if(one == three) //will this be unboxed or do we need to put a explicit
                 //condition like if(one.intValue() == three.intValue()) 
   System.out.println("Equal");
else 
   System.out.println("Not Equal");  


if(one == two) //will this be unboxed or do we need to put a explicit
               //condition like if(one.intValue() == two) 
   System.out.println("Equal");
else 
   System.out.println("Not Equal");  
于 2013-01-07T03:23:16.033 に答える
0

ボックス化とボックス化解除は Java のキャストの一種で、プリミティブからそのラッパー クラスまたはその逆にキャストします。たとえば、ブール値からブール値 (ボックス)、またはブール値からブール値 (ボックス化解除) にキャストします。

Java でのキャストの種類。例:

  • 同一性変換 (§5.1.1) 文字列から文字列へ

  • 拡張プリミティブ変換 (§5.1.2) バイトから int へ

  • 縮小プリミティブ変換 (§5.1.3) int から byte

  • 拡大参照変換 (§5.1.5) 整数から数値へ

  • 縮小参照変換 (§5.1.6) 数値から整数へ

  • ボクシング変換 (§5.1.7) int から Integer

  • ボックス化解除の変換 (§5.1.8)。整数から整数へ

オートボクシングまたはオートアンボクシングは、コンパイラがボックス化/ボックス化解除の変換を行うときに発生します (キャスト式としてソース コードに明示的に表示されません)。たとえば、参照した質問を参照してください。

于 2009-02-01T22:11:41.860 に答える
0

ボックス化は、Integer オブジェクト内の int プリミティブ値など、コンテナー内の値をラップしています。

キャストは、タイプの見方にすぎません。

前者は別の種類の値を生成し、後者は既存の値の扱い方を変更するだけです

プリミティブ型間のキャストを除いて、実際にはそれらの表現が変更されます。(これはそれをより明確にしませんか?)

于 2009-02-01T22:04:44.713 に答える