2012-04-24 1 views
16

Возможно ли в Java переопределить массив toString для объектов?Возможно ли в Java переопределить 'toString' для массива Objects?

Например, я создал простой класс, User (на самом деле не имеет значения, какой класс он имеет, поскольку это общий вопрос). Возможно ли, что после создания клиентом массива User[] и клиент использует System.out.print(array), он не будет печатать адрес массива, а вместо него настроен toString()?

PS: Конечно, я не могу просто переопределить toString() в своем классе, так как он связан с отдельными экземплярами.

+0

Что-то вроде 'java.util.Arrays.toString (массив) '. –

+3

Обратите внимание, что 'Object []. ToString()' does ** not ** возвращает «адрес» массива. Он возвращает массивы [хэш-код идентификатора] (http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#identityHashCode (java.lang.Object)). –

ответ

17

Нет. Конечно, вы можете создать статический метод User.toString (User []), но он не будет называться неявно.

+0

Я не хочу использовать статические методы для печати, im пытается достичь toString() без параметров .. – Popokoko

+6

Понял. Вот почему первое слово моего ответа было «нет». –

4

Вы можете создать отдельный класс, содержащий массив, и переопределить toString().

Я думаю, что самым простым решением является расширение класса ArrayList и просто переопределение toString() (например, UserArrayList).

+1

OP не использует ArrayList, он использует массив. – EJP

9

Вы можете использовать Arrays.toString(Object[] a);, который вызовет метод toString() для каждого объекта в массиве.

Редактировать (с комментариями):

Я понимаю, что это вы пытаетесь достичь, но Java не поддерживает, что в это время.

В Java массивы представляют собой объекты, которые динамически создаются и могут быть назначены переменным типа Object. Все методы класса Object могут быть вызваны в массиве. См. JLS Ch10

Когда вы вызываете toString() на объект, он возвращает строку, которая «текстово представляет» объект. Поскольку массив является экземпляром Object, поэтому вы получаете только имя класса, значение @ и шестнадцатеричное значение. См. Object#toString

Метод Arrays.toString() возвращает эквивалент массива в виде списка, который переименован и toString() вызывается для каждого объекта в списке.

Так что, пока вы не сможете сделать System.out.println(userList);, вы можете сделать System.out.println(Arrays.toString(userList);, который по существу достигнет того же.

+0

Я все еще не понимаю, как это достигает того, что я хотел, предполагая, что у меня есть класс, я хочу, чтобы этот класс «поддерживал» toString() для типа массива. пример: создание класса [] array = new Class [3], как только выполняется System.out.println (массив), для этого класса будет toString(). – Popokoko

3

Единственный способ сделать это - перекомпилировать Object.toString() и добавить статьи instanceof.

Я запросил изменение в Монетной плате для обработки массивов более ориентированным на объекты. Я чувствовал, что слишком много для начинающих, чтобы узнать все необходимые функции в массиве, массивах и 7 других вспомогательных классах, которые обычно используются.

Я думаю, что в конце концов было сделано заключение о том, что для правильной привязки массивов объектная ориентация - это нетривиальная задача, которая будет перенесена на Java 9 или дальше.

0

Вы не можете этого сделать. Когда вы объявляете массив, тогда Java фактически создает скрытый объект типа Array. Это особый вид класса (например, он поддерживает оператор access access []), к которому обычный код не может напрямую обращаться.

Если вы хотите переопределить toString(), вам придется расширить этот класс. Но вы не можете этого сделать, поскольку он скрыт.

Я думаю, что так хорошо. Если бы можно было расширить класс Array, тогда можно было бы добавлять туда всевозможные методы. И когда кто-то другой управляет этим кодом, они видят собственные методы в массивах, и они «WTF ... Это C++ или что?».

0

Ну, вы можете попробовать обернуть все звонки Object.toString с помощью AspectJ около advice и вернуть желаемый результат для массивов. Тем не менее, я не думаю, что это хорошее решение :)

2

Попробуйте

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

грубых, если вы настроили user.toString() метод