マット・ハイダー:
私は、カスタムオートボクシングはJavaでサポートされていないことを理解し、私はまた、私はNumberオブジェクトを拡張できることに気づきました。数値オブジェクト自体がプリミティブのオートボクシングを許可するように思えるので、これは動作します:
Number val = 5; //This compiles no problem
しかし、私は数を拡張し、子のタイプを使用しようとすると、プログラムはコンパイルに失敗します。
MyNumber num = 5; //This does not compile :(
私はこれが許可されておらず、おそらくJavaで許されることはありませんが、何のメカニズムは、この不連続性が発生する原因を理解しますか?番号のラッパー機能は、クラス自体を超えてどこかに扱い、おそらくいくつかの特殊なカプセル化その防止カスタムラッパーの作成がありますか?
JB Nizet:
図5は、整数リテラルです。その種類は、このようにありますint
。
それは基準種別(番号)の変数に割り当てられているので、そのラッパータイプにautoboxedは次のとおりjava.lang.Integer
。この整数は、変数に割り当てられ、以来、それが有効だされInteger
ている番号:整数クラスNumberを拡張するクラス。
逆に、整数MyNumberを拡張しません。だから型の変数に整数の割り当てはMyNumber
無効である:整数MyNumberではありません。
これは持っていないので、多くのアンボクシングで行います。それはあなたが行うことができないという事実に関係しています
MyNumber n = someInteger;
同じように、あなたがすることはできませんので、
MyNumber n = someString;
:種類はちょうど互換性がありません。