ジャバ:オートボクシングとキャストの違いは何ですか?
-
20-08-2019 - |
質問
この質問 「Java でオートボクシングによって一部の呼び出しがあいまいになるのはなぜですか?」についてです。
しかし、回答を読んでみると、キャスティングに関する言及が数多くあり、違いを完全に理解しているかどうかはわかりません。
誰か簡単な説明をしてもらえますか?
解決
ボクシングは、あなたが参照型へのプリミティブ型を変換する際に、非ボクシングは逆です。あなたは一つのタイプは、別の型として扱われることをしたいときのキャストは、プリミティブ型と参照型の間で、これは、暗黙的または明示的なボクシングの操作を意味しています。それが明示的にする必要があるかどうかは、言語機能です。
他のヒント
キャストとボックス化/アンボックス化はどちらも型と見かけの (または実際の) 変換に関係しますが、ボックス化/アンボックス化はプリミティブ型とそれに対応するラッパー型の間の関係に特有であり、キャストは型の明示的または暗黙的な変更を表す用語です。より一般的な意味です。
鋳造 は、関連するものの異なる 2 つの意味を持つ一般的な用語です。
1 つの型の値を扱う かのように それは別の型の値でした。この最初の使用例の 2 つの例は次のとおりです。
1.1.そのクラスを考えると
B
クラスを拡張しますA
, 、あなたは求めることができますmyB
の例B
~のインスタンスとして扱われるA
書くことによって((A) myB)
のインスタンスへの参照がある場合はどこでも、A
現れるかもしれない。これは実際には新しいインスタンスを生成しませんA
.1.2.Java5 以前のコレクションは、すべてのコンテンツを
Object
;これには通常、コレクションからオブジェクトを取得した後にキャストを使用する必要がありました。たとえば、String
でMap
その長さを取得する必要がある場合は、次のように書きます((String) myMap.get(someKey)).length()
ここで、を呼び出すためにキャストが必要になります。length
の方法String
. 。繰り返しますが、これによって新たな問題が発生するわけではありません。String
作成されます。明示的に 変換する あるタイプから別のタイプへ(すなわち、表現を明示的に変更します)。この 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;
ボックス化/ボックス化解除コードはコンパイラによって挿入されます。
List<String> list = (List<String>)object;
キャストです。
void doSomething(Integer i) { ... }
...
doSomeething(5);
オートボクシングされます。
Integer getSomething();
...
int i = getSomething();
オートアンボクシングされます。
オートボクシングは、次のようなコードを防ぐためにJava 5で導入されました
map.put("ABC", new Integer(5));
map.put("DEF", new Integer(6));
あなたは今言うことができます:
map.put("ABC", 5);
その簡単になくなり- それはあなたが何をしているかの完全にわからない場合は、いくつかの落とし穴を持っています。
。ボクシングは、Integerオブジェクト内部INTプリミティブ値として、容器内の値をラップされている
鋳造の型を見てどれだけです。
前者は値の別の種類を生成し、後でちょうど、すでに既存の値を扱う方法を変更する
プリミティブ型間のキャストを除いては、実際に自分の表現を変更します。 (これは、それが明確にそれをしないことはない?)
ボックス化とアンボックス化は Java のキャストの一種で、プリミティブからそのラッパー クラスまたはその逆にキャストします。ブール値からブール値 (ボックス)、またはブール値からブール値 (アンボックス)。
Java のキャストの種類と例:
ID 変換 (§5.1.1) 文字列から文字列へ
拡大プリミティブ変換 (§5.1.2) byte から int へ
縮小プリミティブ変換 (§5.1.3) int から byte へ
拡大参照変換 (§5.1.5) 整数から数値へ
縮小参照変換 (§5.1.6) 数値から整数へ
ボクシング変換(§5.1.7)int to Integer
アンボックス化変換 (§5.1.8)。整数から整数へ
オートボックス化または自動アンボックス化は、コンパイラーがボックス化/アンボックス化変換を実行するときに発生します (キャスト式としてソース コードに明示的に表示されません)。あなたが参照した質問を参照してください。
んオートボクシングとアンボクシングは、次の場合に適用することができますか?
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");