2

戻り値の型が であるかなり複雑なメソッドを持つコードを継承しましたObject。入力に応じて、このメソッドは、異なる型 ( IntegerStringnullなど) を返すことが保証されていると言います。を返すことが保証されている場合に、そのメソッドを呼び出していIntegerます。以下は (明らかに) コンパイルされません:

int result;
result = foo(parameters);

コンパイラは、 からObjectへの型の不一致について文句を言いintます。ただし、次の行は両方ともコンパイルされます。

result = (int) foo(parameters);
result = (Integer) foo(parameters);

両方の呼び出しが、私がやりたいことを実行することを知っています。short(さらに言えば、またはへのキャストShortは機能します。)私の質問は次のとおりです。これら2つのキャスト呼び出しの実装に実際的な違いはありますか?ベストプラクティスまたはパフォーマンスに関して、一方は他方よりも優れていますか? 明確にするために、プリミティブとラッパーの違い、それらのメモリ使用量、能力などを知っています。からのキャストについてのみ質問しています。nullObject

私が理解している限り、両方の呼び出しは同じ手順に従います。1)Objectを an にキャストしInteger(必要に応じて a をスローします)、2) そのからClassCastExceptionan を抽出します。intInteger

重複した質問がありましたら申し訳ありません。Object私はそれを検索しましたが、 からへのキャストの質問に答える質問は見つかりませんでしたint

4

2 に答える 2

3

int実際には、 と を使用してもパフォーマンスに大きな違いはありませんInteger。1 つはプリミティブとして技術的に高速であり、もう 1 つは使用できる便利なクラス関連メソッドを備えています。

「キャスト」に関しては、メソッド コードで がfoo()返される場合、返される はすでに であるため、 にキャストするときのパフォーマンスの損失はありません。IntegerIntegerObjectInteger

foo()を返す場合int、それをプリミティブにキャストするためにわずかなコストがかかりますが、目立ったものはありません。

public Object fooInt() {
    return 5;
}
public Object fooInteger() {
    return new Integer(5);
}

Integer integerResult = (Integer)fooInteger(); //No cost
integerResult = (Integer)fooInt(); //Small casting cost

int intResult = (int)fooInteger(); //Small casting cost
intResult = (int)fooInt(); //No cost

代わりに、後で結果オブジェクトを処理する際に anintと anを使用した方が便利かどうかを検討してください。anを anIntegerにキャストするコストは、Java ではまったく無視できます。intInteger

于 2013-10-30T05:02:27.673 に答える
0

プリミティブ値はパフォーマンス面で効率的です。それが、プリミティブにする理由です。オブジェクトの場合はより多くのメモリを使用しますが、非常に使いやすく、非常に便利な API を提供します。

于 2013-10-30T04:58:32.930 に答える