2012-04-24 6 views
16

オブジェクト配列のtoStringをJavaでオーバーライドすることは可能ですか?Javaでは、Object配列に対して 'toString'をオーバーライドすることは可能ですか?

たとえば、単純なクラスUserを作成したとしましょう(これは一般的な質問ですので、どちらのクラスでも問題ありません)。クライアントがUser[]配列を作成し、クライアントがSystem.out.print(array)を使用すると、配列のアドレスは印刷されず、代わりにカスタマイズされたtoString()が出力される可能性はありますか?

PS:私のクラスではtoString()をオーバーライドすることはできません.1つのインスタンスに関連しているからです。

+0

に 'java.util.Arrays.toString(配列)のようなものをカスタマイズした場合は粗いのこの

User[] array = new User[2]; System.out.println(Arrays.asList(array)); 

をお試しください'。 –

+3

'Object []。toString()'は配列の「アドレス」を返しません**。配列[identity hash code](http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#identityHashCode(java.lang.Object))を返します。 –

答えて

17

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

+0

私は印刷のために静的メソッドを使用したくありません。パラメータなしでtoString()を実現しようとしています。 – Popokoko

+6

だから私の答えの最初の言葉は "いいえ"でした。 –

4

配列を含む別のクラスを作成し、toString()を上書きすることができます。

最も簡単な解決策は、ArrayListクラスを拡張し、toString()(たとえば、UserArrayList)を上書きすることだと思います。

+1

OPはArrayListを使用していません。彼は配列を使用しています。 – EJP

9

Arrays.toString(Object[] a);を使用すると、配列内の各オブジェクトに対してtoString()メソッドを呼び出すことができます。 (コメントから)

編集

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

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

オブジェクトに対してtoString()を呼び出すと、そのオブジェクトを「テキストで表す」文字列が返されます。なぜなら、配列の名前はObjectのインスタンスなので、クラスの名前は@と16進値だけです。 Object#toString

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

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

+0

私はまだ、私はいくつかのクラスを持っていると仮定して、私が望むものを達成する方法を理解していない、私はこのクラスがtoString()配列型の "サポート"します。たとえば、System.out.println(配列)が実行されると、Class [] array = new Class [3]を作成すると、そのクラスはtoString()を持ちます。 – Popokoko

3

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

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

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

0

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

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

このようにするとよいと思います。 Arrayクラスを拡張することができれば、そこですべての種類のメソッドを追加できます。他の誰かがこのコードを管理すると、配列に関するカスタムメソッドを見ることができます。これらは "WTF ... C++ですか、それとも?"です。

0

さて、あなたはadvice周りAspectJObject.toStringに対するすべての呼び出しをラップすると配列の所望の出力を返すことを試みることができます。しかし、私はそれが良い解決策だとは思わない:)

2

あなたはuser.toString()方法

関連する問題