2009-09-13 16 views
28

いくつかの言語で "ボックス化"と呼ばれるタイプについて聞いたことがあります。タイプが「ボックス化」されているとはどういう意味ですか?

Javaでは、私は "autoboxing"について聞いたことがあります。これは何ですか?それは型のラッパークラスを持っていますか?ボックス化されたタイプまたはボックス化されていないタイプで作業している場合、コードはどのように変更されますか?

答えて

46

一部のデータ型は「プリミティブ」とみなされます。つまり、オブジェクトのように扱われずオブジェクトのプロパティを持たないデータ型です。

ほとんどのプラットフォームでは、整数型と文字型は基本的なものですが、ボックス化できるタイプの例です。

ボクシングとは、それらをオブジェクトにラッピングしてオブジェクトの動作を持たせることを意味します。

正確な意味と動作は、使用している言語によって異なります。いくつかの言語(スモールトークなど...少なくとも私がそれをやっていたときに戻ってきたことは...)は、プリミティブ型を許可せず、すべてをオブジェクトと見なしますが、それに伴うパフォーマンス上のペナルティがあります。今日のプロセッサでは、生の数字と生のメモリを使って作業する必要があります。ボックス化された2つの整数を追加する場合は、たとえば、シーンの背後でプリミティブ型に「ボックス化されていません」という番号が追加され、新しい整数にボックス化されます。

3

ボックス型とは、値がヒープ上のブロックに割り当てられ、ポインタによって参照されることを意味します。これは、ランタイムの実装の統一性に優れています(汎用関数などを簡単に作成できるようになります)。

0

一般的に、コレクションを扱うときは、オブジェクトの配列を扱います。 Javaのような言語では、プリミティブとオブジェクトの間に違いがあります。プリミティブが「ボックス化」されている場合、それは基本的にプリミティブの周りのラッパーであるため、オブジェクトを予期している残りのフレームワークとうまく連動します。

オートボクシングは、プリミティブをオブジェクトに入れたり、オブジェクトのプリミティブを透過的に引き出したりするためのものなので、自分で行う余計なステップについて心配する必要はありません。

12

はい、ボクシングは値型を取って参照型でラップすることを意味します。 javaからオートボクシングが導入されて以来、あなたは以下を行うことができます:

void foo(Object bar) {} 
//... 
    foo(1); 

そして、javaは自動的にint1を整数に変換します。あなたがしなければならないと思います以前のバージョンでは:ジェネリック医薬品を扱う場合、リスト内の店舗int型に、あなたが持っていると思いますので、あなたは、ジェネリックでプリミティブを使用することはできませんので、

foo(new Integer(1)); 

オートボクシングは、Javaで最も有用ですList<Integer>を作成し、intをリストボックスに入れます。

11

Javaのためのより具体的な情報:

オートボクシングは、javaが自動的にほとんどの場合、自動的にそのオブジェクトのバージョンBooleanIntegerbooleanintのようなものに変換することができます。逆も可能です。例えば

:オートボクシングは同じことを行うには、このコードが必要になります持っていないのjavaの

int a = 3; // no boxing is happening 
Integer b = 3; // newer versions of java automatically convert the int 3 to Integer 3 
int c = b; // these same versions also automatically convert Integer 3 to int 3 

旧バージョン:

int a = 3; // works the same 
Integer b = new Integer(3); //must set up a Integer object manually 
int c = b.intValue(); //must change Integer object to a primitive 

しかし、あなたはまだ持っているいくつかのシナリオがあります手動で行うこと。あなたがこれを行うにしようとすると、今

assertEquals(int a, int b); 
assertEquals(Object a, Object b) 

:たとえば、あなたがそうのような二つの方法を持つクラスを持っている想像

Integer a = 3; 
int b = 3; 
assertEquals(a, b); // this will not compile 

それは把握することはできませんので、これは動作しない理由は、アンボックスにするかどうかは、aからintまで、またはボックスbからIntegerまでです。したがって、どのメソッドシグネチャを呼び出すべきかは曖昧です。この問題を解決するには、これらのいずれかを行うことができます

assertEquals((int) a, b); 
assertEquals(a, (Integer) b); 
0

箱入りが、彼らは通常の値の型を取って、その周りにオブジェクトを作成したことを意味します。箱に入れるのと同じように。これは、オブジェクトを構築するオーバーヘッドのために、一般的に回避されるべきである。

関連する問題