5

私は SCJP 試験の勉強をしていますが、頭を悩ませることができない問題に遭遇しました。

この本には、拡張してから箱詰めすることはできないと書かれていますが、箱詰めしてから拡張することはできます。ボックス化できない例としては、Long を期待するメソッドとバイトで呼び出されるメソッドがあります。

彼らの説明は次のとおりです。

考えてみてください…最初にボックス化しようとすると、バイトはバイトに変換されます。ここで、Byte を Long に拡張する試みに戻ります。もちろん、IS-A テストは失敗します。

しかし、それはボックスのように聞こえますが、私には広がりません。

現状では、この本はこの問題について正確に明確ではないため、誰かがボックス全体を明確にして、幅を広げてボックスを広げることができますか。

編集: 明確にするために: SCJP Sun Certified Programmer for Java 6 book の 252 ページと 253 ページについて話しています。 http://books.google.be/books?id=Eh5NcvegzMkC&pg=PA252#v=onepage&q&f=false

4

5 に答える 5

4

言語は混乱しています。


基本的に、バイト -> バイト -> ロングのように進むことはできません。これは
、バイトとロングが is-a 関係を共有していないためです。
したがって、これを実行しようとします:
byte -> long -> Long
しかし、それもできません (明らかにコンパイラの制限のため)。そのため、失敗してエラーがスローされます。

しかし一方で、これを行うこともできます:
バイト -> バイト ->
バイトはオブジェクトなので、バイト -> バイト -> オブジェクト。

2 つの関数とバイト変数を検討してください。

toLong(ロング x)
toObject(オブジェクト x)
バイト b = 5;

次に、このステートメントは不正になります:
toLong(b);
// b -> new Byte(b) -> new Long(new Byte(b)) は不正だからです。
AND byte -> long -> long は、コンパイラの制限により実行できません。

しかし、次のステートメントは正当です:
toObject(b);
// なぜなら b -> new Byte(b) -> new Object(new Byte(b)) は合法だからです.

于 2010-10-31T17:22:07.540 に答える
4

「拡大してからボクシング」が許可されない理由は、次の理由による可能性があります (SCJP 本の 249 ページ)。

Java 5 の設計者は、最も重要なルールは、既存のコードが以前と同じように機能することであると判断しました。そのため、拡張機能が既に存在していたため、拡張によって呼び出されるメソッドは、ボクシングに依存する新しく作成されたメソッドに負けてはなりません。

于 2012-11-10T09:08:31.693 に答える
3

基本的に、これが意味するのは、拡張はプリミティブ型でのみ機能し、ラッパーでは機能しないということです。最初にボックス化すると、ラッパーが表示されます(byte-> Byte)。Byteただし、ラッパー-、、、、、およびDoubleには継承関係(IS-A)Floatはありません。たとえば、パラメータはを受け入れることができません。IntegerLongShortLongByte

byteしたがって、最初に( -> long)、次にボックス(long-> )を広げる必要がありますLong

于 2010-09-15T19:33:35.417 に答える
1

バイトはロングに収まらないので、それは拡大ではありません。それが機能しない理由です。

ボックスにバイトしてから、Objectまたはに広げることができますNumber

あなたの本が言うように:

バイトをロングに広げようとすることに戻りました


あなたの場合、コードは次のようになっていると思います。

byte b = 1;
Long l = b;

bはByte(最初にボクシング)に変更されますがLong、Byteは。のサブクラスではないため、aに変更することはできませんLong

その他の手順:

byte b = 1;
Byte byteB = b; //works
Long l = byteB; //doesn't work
于 2010-09-15T19:09:37.267 に答える
1

基本的には、ボックス化してから拡大することはできますが、ボックス化してから拡大することはできません。ただし、ボックス化してから拡大する場合、拡大されるクラスは、拡大先のクラスと同じ継承ツリーにある必要があります。

示されている例は、ボックス化してから拡大しようとしていますが、これが無効である理由は、Byte が Long ではないためです。つまり、それらは同じ継承ツリーにありません。ただし、例で Byte と Numeric を使用している場合は、Byte から Byte にボックス化してから、Byte IS-A Numeric として Byte から Numeric に拡張することが有効です (これらは同じ継承ツリーにあります)。

于 2011-01-28T08:07:05.947 に答える