1

Java では、次のようにして a を簡潔にガードできますNullPointerException

if ("myString".equals(someOtherString))

しかし、整数では同じことはできません。

if (5.equals(someOtherInteger))

コンパイル時エラーが発生します。この設計上の決定がなされた理由について何か考えはありますか? または、それを説明するリソースはありますか? 前もって感謝します。

編集:someOtherIntegerではIntegerなく、intです。

4

6 に答える 6

13

StringJava では常にオブジェクトでした。文字列のオートボクシングはなく、原則としてあり得ません。プリミティブintからIntegerオブジェクトへのオートボクシングは、かなり最近導入されました。

プリミティブのメンバー変数にアクセスしようとしてもオートボクシングが呼び出されない理由を尋ねることは有効ですが (95.toString(radix)実際には非常に便利です)、その理由は、ほとんどすべてwrappedPrimitive.method()が同等のWrapperClass.method( primitive )バージョン。

equals()==はすでに存在するため、通常、プリミティブ型には不要です。ただし、null ガードとして適切なケースを作成します...インスタンスのボックス化を解除しようとし、残念ながらインスタンスが の場合は5 == integerInstanceスローします。(最初はあなたの指摘を十分に理解していませんでした。)NullPointerExceptionnull

とはいえ、Java に取り組んでいる人から、現在またはオートボクシングの導入時に、この種の機能を検討しているかどうかについて聞くことができれば、本当に素晴らしいことです。

于 2012-04-17T03:34:39.280 に答える
10

JLSは、ボックス化変換が代入変換、メソッド呼び出し変換、またはキャスト変換中にのみ発生できることを指定しています。変数に割り当て5たり、引数としてメソッドに渡したり、明示的にキャストしたりしIntegerていないため、自動ボックス化されません。

代入変換 (§5.2、§15.26) は、式の型を指定された変数の型に変換します。

代入変換により、OutOfMemoryError (ボックス化変換(§5.1.7) の結果として)、NullPointerException (アンボックス化変換 (§5.1.8) の結果として)、または ClassCastException (未チェックの変換 ( §5.1.9)) が実行時にスローされます。

メソッド呼び出し変換 (§5.3、§15.9、§15.12) は、メソッドまたはコンストラクター呼び出しの各引数に適用され、1 つのケースを除いて、代入変換と同じ変換を実行します。

メソッド呼び出しの変換により、OutOfMemoryError (ボックス化変換(§5.1.7) の結果として)、NullPointerException (ボックス化解除変換 (§5.1.8) の結果として)、または ClassCastException (未チェックの変換の結果として) が発生する場合があります。 (§5.1.9)) 実行時にスローされます。


キャスト コンテキストでは、次のいずれかを使用できます。

...

必要に応じて拡大参照変換 (§5.1.5) が続くボックス化変換 (§5.1.7)

于 2012-04-17T03:43:13.940 に答える
1

あなたが使用することができます

if (someOtherInteger!=null && someOtherInteger == 5)
于 2012-04-17T03:26:39.847 に答える
1

安全対策として、オートボクシングはリテラル5には実装されていませんが、 string には実装されていると思われます。myString二重引用符が意図しないものである可能性は低いため、二重引用符が前後に追加された構文構造を自動ボックス化しても""安全です。したがって、ユーザーの意図は明確であり、型の安全性が損なわれることはありません。

ただし、リテラル5はユーザー側のタイプミスである可能性があります。または、整数ではなく文字列を意図している可能性があります。したがって、(他の多くの利点の中でも) タイプミスを防ぐために、オブジェクト指向プログラミングで使用する前に変数を宣言する必要があるという利点を維持するために (オートボクシングの場合のように暗黙的であっても)、5はオートボックス化されません。

于 2012-04-17T03:39:33.877 に答える
0

intメソッド自体をサポートしないプリミティブ型です。2 を比較するには、次のように規則をints使用するだけです。==

if(a == b) 

他のいくつかのメソッド呼び出しをサポートするIntegerのラッパーであるクラスがありますint

編集:

比較したい編集に基づいていますIntegerが、問題はリテラル 5 ではなく、Integer新しい整数を作成する必要があることです。

Integer myInt = 5;
if(myInt.equals(someOtherInteger)) ...

この設計は、プリミティブがメソッドを持たないという事実に固有のものです。プリミティブがメソッドをサポートする必要があるかどうか (または単に存在しないかどうか) は、Java が純粋なオブジェクト指向言語であるかどうかに関する議論に不可欠です (プリミティブが存在するという事実のために、多くの人はノーと言います)。

于 2012-04-17T03:28:14.933 に答える
0

さまざまな比較について少し読んでみましょう: http://www.leepoint.net/notes-java/data/expressions/22compareobjects.html

拒否するのが組み込みの設計であったかどうかはわかりませんint

もしあなたがそうするなら

Integer s=5;
Integer d=5;
if(d.equals(s)){
    System.out.println("Fun");
}

それはうまく動作します。

于 2012-04-17T03:31:08.210 に答える