web-dev-qa-db-ja.com

Java:オートボクシングとキャストの違いは何ですか?

この質問 「自動ボクシングによってJavaで一部の呼び出しがあいまいになるのはなぜですか?」に関するものです。

しかし、答えを読んでみると、キャスティングへの言及がたくさんあり、その違いを完全に理解しているとは思えません。

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

23
nzpcmad

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

38
cmsjr

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

Castingは、2つの関連しているが異なる意味を持つ一般的な用語です。

  1. あるタイプの値の処理あたかもそれは別のタイプの値でした。この最初の使用法の2つの例は次のとおりです。

    1.1。クラスBがクラスAを拡張する場合、myBのインスタンスをBのインスタンスとして扱うようにAに要求できます。 Aのインスタンスへの参照が表示される可能性がある場所に((A) myB)を書き込むことによって。これは実際にはAの新しいインスタンスを生成しません。

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

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

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

Boxingは、プリミティブ型をコンテナオブジェクトにラップすることを指します。通常は、オブジェクトが必要な場合にのみ実行されます(たとえば、コレクションに値を格納する)。プリミティブタイプとラッパータイプはペアで提供されます。

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;

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

25
joel.neely
List<String> list = (List<String>)object;

ギプスです。

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

オートボクシングです。

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

自動開封です。

8
cletus

オートボクシングはJava 5で導入され、次のようなコードを防ぎます。

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

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

map.put("ABC", 5);

簡単ですが、何をしているのか完全にわからない場合は、いくつかの落とし穴があります。

4
Fortyrunner

次の場合、オートボクシングとボックス化解除を適用できますか?

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");  

ボクシングとは、整数オブジェクト内のintプリミティブ値など、コンテナ内の値をラップすることです。

キャスティングは、タイプの見方です。

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

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

0
John Nilsson

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

Javaでのキャストのタイプ、例:

  • iD変換(§5.1.1)文字列から文字列

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

  • ナローイングプリミティブ変換(§5.1.3)intからbyte

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

  • 絞り込み参照変換(§5.1.6)数値から整数へ

  • ボクシングの変換(§5.1.7)intから整数へ

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

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

0
eljenso