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

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

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

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

Ответ 1

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

Ответ 2

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

Изменить (из комментария):

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

Попробуй это

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

конечно, если вы настроили user.toString()

Ответ 6

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

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

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

Ответ 7

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