53

プリミティブを文字列に変換したいのですが、試しました:

myInt.toString();

これはエラーで失敗します:

int cannot be dereferenced

ここで、プリミティブは参照型ではない (つまり、オブジェクトではない) ため、メソッドを持つことができないことがわかりました。ただし、Java 5 では、オートボクシングとアンボクシングが導入されました (C# のように... C# では好きではありませんでしたが、それは重要ではありません)。したがって、オートボクシングでは、上記が myInt を Integer に変換してから toString() を呼び出すことを期待します。

さらに、私の記憶が間違っていない限り、C# ではそのような呼び出しが許可されていると思います。これは、Java の autoboxing/unboxing 仕様の残念な欠点にすぎないのでしょうか?それとも正当な理由があるのでしょうか?

4

8 に答える 8

47

Javaのオートボクシング/アンボクシングは、プリミティブを逆参照できるほどには進んでいないため、コンパイラはそれを防ぎます。コンパイラはまだmyIntプリミティブとして認識しています。この問題に関する論文がjcp.orgにあります。

オートボクシングは主に、割り当てまたはパラメーターの受け渡し中に役立ちます。プリミティブをオブジェクトとして渡す (またはその逆)、またはプリミティブをオブジェクトに割り当てる (またはその逆) ことができます。

残念ながら、次のようにする必要があります:(パトリックの称賛、私はあなたのやり方に切り替えました)

Integer.toString(myInt);
于 2008-08-07T01:09:17.547 に答える
27

ジャスティンが言ったことについても同じですが、代わりにこれを行う必要があります。

Integer.toString(myInt);

割り当てを1つか2つ節約し、読みやすくなります。

于 2008-08-07T01:16:21.263 に答える
15

それを行うもう1つの方法は、次を使用することです。

String.valueOf(myInt);

このメソッドは、すべてのプリミティブ型とに対してオーバーロードされObjectます。このようにして、使用しているタイプについて考える必要さえありません。メソッドの実装は、指定されたタイプの適切なメソッドを呼び出しますInteger.toString(myInt)

http://java.sun.com/javase/6/docs/api/java/lang/String.htmlを参照してください。

于 2008-08-10T07:32:41.587 に答える
9

私には仕様の欠点のようです

さらに欠点があり、これは微妙なトピックです。これをチェックしてください:

public class methodOverloading{
   public static void hello(Integer x){
      System.out.println("Integer");
   }

   public static void hello(long x){
      System.out.println("long");
   }

   public static void main(String[] args){
      int i = 5;
      hello(i);
   }
}

ここでは、コンパイラが自動ボクシングよりも拡張を選択しているため、「long」が出力されます(自分でチェックしていません)。オートボクシングを使用するときは注意するか、まったく使用しないでください。

于 2008-08-07T04:16:20.480 に答える
6

あなたの例に最も近い有効な構文は

((Integer) myInt).toString();

コンパイラが終了すると、それは次と同等です

Integer.valueOf(myInt).toString();

ただし、これは従来の使用法ほどうまく機能しませんString.valueOf(myInt)。特別な場合を除いて、新しい Integer インスタンスを作成し、すぐにそれを破棄するため、不要なガベージが増えるためです。(小さな範囲の整数がキャッシュされ、配列アクセスによってアクセスされます。)おそらく言語設計者は、パフォーマンス上の理由から、この使用法を思いとどまらせたかったのでしょう。

編集:反対票を投じた人が、これが役に立たない理由についてコメントしていただければ幸いです。

于 2008-09-24T16:18:30.543 に答える
2

誰もが指摘しているように、オートボクシングによって一部のコードを単純化できますが、プリミティブが複雑な型であると偽ることはできません。

また興味深い: Javaの「オートボクシングはコンパイラレベルのハックです」 。オートボクシングは、基本的に Java に追加された奇妙なクラッジです。それがどれほど奇妙であるかについての詳細は、この記事をチェックしてください。

于 2010-01-23T14:16:42.277 に答える
1

C# では、整数は参照型ではなく、 ToString()を呼び出すためにボックス化する必要もありません。ただし、これらフレームワーク内のオブジェクトと見なされます (ValueType として、値のセマンティクスがあります)。CLR では、プリミティブのメソッドは、それらをスタック (ldind) に「間接的に」ロードすることによって呼び出されます。

于 2008-09-10T21:20:19.120 に答える