なぜ言語の必要性ボクシングやUnboxing?
質問
このなかでボクシングやunboxing, その なぜ い言語のようなJavaとC#の必要性。
私は大幅に馴染みのwtih C++、STL、効果がある。
C++でただ単に"サムネやエンジンのようなことは非常に簡単に
std::vector<double> dummy;
しているのか教えてください経験Javaが、私はそれを見て驚いたらないといけなかったので何か書いてもらえるよう、このような
ArrayList<Double> dummy = new ArrayList<Double>();
とになるのか、なぜそれがオブジェクトは、何がうハード技術などのプリミティブ型の話ジェネリック医薬品?
解決
どん技術などのプリミティブ型の話ジェネリック医薬品?
Javaの場合、この方法によってジェネリック医薬品です。Javaでは、ジェネリック医薬品はコンパイル時のコツとを防ぐを Image
オブジェクトへ ArrayList<String>
.しかし、Javaのジェネリック医薬品に実装され消去タイプ:汎用タイプの情報は失われた時に実行します。これは互換性の理由でジェネリック医薬品を追加しておりJavaります。ということは、実行時には、 ArrayList<String>
は実質 ArrayList<Object>
(以:だけで ArrayList
ることを期待して返しま Object
すべての方法と自動的に集め String
を取り出すときとなります。
ですが int
ないから Object
, できないのであるArrayListることを期待(ランタイム時において) Object
ことができませんキャストする Object
へ int
ます。このプリミティブ int
必要に包まれた入するタイプなの継承から Object
, のように、 Integer
.
C#例えば、作品とは異なります。ジェネリック医薬品のC#でも強制実行時に、ボクシングが必要となる List<int>
.ボクシングクライアントまで、フルのC#のみ起こったとき、店舗値型のように int
は、参照の型変数のように object
.以降 int
クライアントまで、フルのC#を継承 Object
クライアントまで、フルのC#書 object obj = 2
完全に有効で、ただの箱詰めされまは、自動的に行われ、コンパイラによって( Integer
参考タイプには、ユーザに公開されてたりとか付けたやつでも強い
他のヒント
ボクシングやunboxing必要から生まれの方の言語(C#、Javaの実施とそのメモリ割り当てる。
特定の種類を割り当てられるスタックおよびその他のヒープ.扱うために、スタックに割り当てられたタイプとしてのヒープの割り当てられたタイプ、ボクシングが必要ですのスタックに割り当てタイプのヒープ.Unboxingは逆のプロセス。
クライアントまで、フルのC#のスタックに割り当ての種類と呼ばれる 値の種類 (例: System.Int32
や System.DateTime
やヒープの割り当てられた種類と呼ばれる 参照型 (例: System.Stream
や System.String
).
場合によっては有利な処理できる値型のように参照型(反射は一例)で唯一の資産運用と公私年金制度、ボクシングやunboxingは避けられます。
これがプリミティブ継承しませんからのオブジェクトです。い方法とお受けすることができなか、あらゆるものすべてのパラメータは、例えば.
class Printer {
public void print(Object o) {
...
}
}
き渡す必要があり簡単なプリミティブの値にする方法には、
printer.print(5);
いきいことなくボクシング/unboxing、5は、プリミティブでないオブジェクトです。き過負荷の印刷方法は各プリミティブ型に有効な機能ですが、痛みました。
できるだけまJavaかに対応しておりませんprimitveタイプのジェネリック.
最初があった問題を問いことを見られてwaseda-net portalから登録してくださいjavaべきも原始的な種類です。もちろんの枠組み議論の実際の質問です。
第二の理由としていませんでしたいられているバイナリ互換性のない走りを変更、VMいジェネリック医薬品のメリット.この後方互換性-移動の互換性の理由もなぜ今なのかコレクションにAPIの支援ジェネリック医薬品とブリンカールとはありません(クライアントまで、フルのC#が導入されたジェネリック医薬品)の完全新設定の一般的意識を集します。
の互換性を使用したersure(汎用型のパラメータ情報を削除でコンパイル時間である理由もそんなに多くのチェックキャスト注意事項などをjava.
だまだまだ十分とはいえませんが追加reifiedジェネリック医薬品がこんなに簡単なものではない。だけで追加のタイプ情報の追加ランタイムを削除するのではなくんの作品がまとめられることにより、ソースバイナリ互換性(だん継続して使用原料の種類できな話、既存のコンパイルされたコードさんが対応できません。
その他のアプローチのC#選択:上記参照
自動自動ボックス化/unboxingな対応を利用することを考える場合が自動ボックス化コストもいます。
Java、C#とC++)も及ぶオブジェクトでコレクションクラスのArrayListのようにできるオブジェクトまたはその子孫(原則とか付けたやつでも強い
パフォーマンス上の理由から、しかし、プリミティブのjava、値型のクライアントまで、フルのC#された特別な状態にします。ていないオブジェクトです。できないようなもの(Java):
7.toString()
もtoStringる方法であるオブジェクトです。くためには、このnod性能と同等のオブジェを作成します。自動ボックス化を取り除の定型コードを入れるプリミティブはそのラッパークラスでできるかどうかを、コードの読みやすくするた.
の差値型のオブジェクライアントまで、フルのC#が灰色が表示されます。■見 こちらの などが異なります。
毎配列以外の非文字列オブジェクトに保存されたヒープが含まれて8-16バイトのヘッダ(サイズ32/64ビットのシステム)、その後の内容によってそのオブジェクトの公共及び民間分野配列、文字列のヘッダー、データフォーマットを定義する配列の長さやサイズの各要素(およびその寸法の長さの余剰次元等)、 その後のすべての分野での最初の要素、すべての分野において第二等されたオブジェクトに対する参照するシステムを容易に確認のヘッダーをどのタイプです。
参照型の保管場所の持つバイトはバイト値を一意に識別するオブジェクトに保存されたヒープ.現在の実装は、この値はポインタです(および意味的に同等の)なの"オブジェクトID".
値型の保管場所、内容値型の分野を持っていないという関連する任意のヘッダを表します。場合はコードを宣言変数の型 Int32
, ありません必要な情報が Int32
何と言っています。その場所で開催される Int32
が有効として格納されたプログラムの一部でないの中に格納する場所そのものです。これは大きな貯蓄が、例えば、万物をそれぞれの分野のタイプ Int32
.各々のオブジェクトを保持 Int32
はヘッダを識別する、クラスで運転できます。一つのコピーがクラスのコードで動作するのは、百万インスタンスは、この分野で Int32
のコードを効率よく、保存のために一つ一つの分野に関する情報が含まれているのです。
ボクシングする必要がある要求が行われたパスの値型の保存場所をコードすることを知らないだろうると考えるのが特定の値タイプです。コードする期待物の未知のタイプで受け入れへの参照オブジェクトに保存されたヒープ.また、各オブジェクトに保存されたヒープは、ヘッダーをどのようなオブジェクトでは、コードを使用できるヘッダまでに必要な利用オブジェクトの必要性を知り、そのタイプです。
るということに注意してくださ.純でを宣言するのかという一般の授業。その宣言を自動生成します家族の授業方法を同一の以外のフォートた型のオブジェクトにも期待されています。ばを通るようにする Int32
を定常 DoSomething<T>(T param)
, が自動的に生成するバージョンのルーチンをインスタンスの型 T
が効果的に交換 Int32
.そのバージョンの日常を知る保存場所として宣言された型 T
を持つ Int32
, んどの場合にもルーチンしたハードコードを使用 Int32
保管場所でする必要はな店舗タイプの情報をその場所です。