18

Javaでオブジェクト配列のtoStringをオーバーライドすることは可能ですか?

たとえば、単純なクラスを作成したUserとします (これは一般的な質問であるため、どのクラスであるかは問題ではありません)。User[]クライアントが配列を作成し、クライアントが を使用System.out.print(array)すると、配列のアドレスではなく、カスタマイズされたtoString().

toString()PS:もちろん、単一のインスタンスに関連しているため、クラスでオーバーライドすることはできません。

4

7 に答える 7

19

もちろん、静的メソッド User.toString( User[] ) を作成できますが、暗黙的に呼び出されることはありません。

于 2012-04-24T10:00:42.607 に答える
10

配列内の各オブジェクトでメソッドArrays.toString(Object[] a);を呼び出す which を使用できます。toString()

編集(コメントから):

あなたが達成しようとしていることは理解していますが、現時点では Java はそれをサポートしていません。

Java では、配列は動的に作成されるオブジェクトであり、Object 型の変数に割り当てることができます。クラス Object のすべてのメソッドは、配列で呼び出すことができます。JLS Ch10を見る

オブジェクトで呼び出すtoString()と、オブジェクトを「テキストで表す」文字列が返されます。配列は Object のインスタンスであるため、クラスの名前、@、および 16 進値のみを取得します。Object#toStringを参照してください

Arrays.toString()メソッドは、配列に相当するものをリストとして返します。これは、リスト内の各オブジェクトに対して繰り返され、呼び出さtoString()れます。

したがって、できることはありませSystem.out.println(userList);んがSystem.out.println(Arrays.toString(userList);、本質的に同じことを達成することはできます。

于 2012-04-24T10:15:51.383 に答える
4

配列を含む別のクラスを作成し、オーバーライドすることができますtoString()

ArrayList最も簡単な解決策は、クラスを拡張してオーバーライドすることだと思いますtoString()(たとえば、UserArrayList)。

于 2012-04-24T09:58:20.730 に答える
3

これを行う唯一の方法は、再コンパイルして句Object.toString()を追加することです。instanceof

よりオブジェクト指向の方法で配列を処理するために Project Coin の変更を要求していました。Array、Arrays、および一般的に使用される 7 つのその他のヘルパー クラスで必要なすべての機能を初心者が学習するのは多すぎると感じました。

最終的に、配列を適切にオブジェクト指向にすることは、Java 9以降にプッシュバックされる重要なタスクであると結論付けられたと思います。

于 2012-04-24T10:19:02.317 に答える
0

さて、あなたはアドバイスの周りにAspectJObject.toStringですべての呼び出しをラップして、配列に必要な出力を返すことを試みることができます。しかし、私はそれが良い解決策ではないと思います:)

于 2012-04-24T15:11:53.453 に答える
0

それをしてはいけない。配列を宣言すると、Java は実際には Array 型の隠しオブジェクトを作成します。これは、通常のコードが直接アクセスできない特別な種類のクラスです (たとえば、インデックス アクセス [] 演算子をサポートします)。

toString() をオーバーライドしたい場合は、このクラスを拡張する必要があります。しかし、それは隠されているため、それを行うことはできません。

このままでいいと思います。Array クラスを拡張できれば、あらゆる種類のメソッドをそこに追加できます。そして、他の誰かがこのコードを管理すると、配列にカスタムメソッドが表示され、「なんてことだ...これはC++ですか?」となります。

于 2012-04-24T10:29:46.867 に答える