なぜオートボクシング数のカスタム子どもたちが継承されませんか?

マット・ハイダー:

私は、カスタムオートボクシングは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;

:種類はちょうど互換性がありません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=185455&siteId=1