Ответ 1
Нет. Конечно, вы можете создать статический метод User.toString(User []), но он не будет называться неявно.
Возможно ли в Java переопределить массив toString для объектов?
Например, скажем, я создал простой класс User
(на самом деле не имеет значения, какой класс он имеет, поскольку это общий вопрос). Возможно ли, что после создания клиента массивом User[]
и клиент использует System.out.print(array)
, он не будет печатать адрес массива, а вместо него настроен toString()
?
PS: конечно, я не могу просто переопределить toString()
в своем классе, поскольку он связан с отдельными экземплярами.
Нет. Конечно, вы можете создать статический метод User.toString(User []), но он не будет называться неявно.
Вы можете использовать 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);
, который по существу достигнет того же.
Вы можете создать отдельный класс, содержащий массив, и переопределить toString()
.
Я думаю, что самым простым решением является расширение класса ArrayList
и просто переопределение toString()
(например, UserArrayList
).
Единственный способ сделать это - перекомпилировать Object.toString()
и добавить предложения instanceof
.
Я попросил изменение в Project Coin для обработки массивов более ориентированным на объекты. Я чувствовал, что это слишком много для новичков, чтобы узнать все функциональные возможности, необходимые в массивах, массивах и 7 других вспомогательных классах, которые обычно используются.
Я думаю, в конце концов, было сделано заключение, что для правильной привязки массивов объектная ориентация - это нетривиальная задача, которая будет перенесена на Java 9 или за ее пределы.
Попробуй это
User[] array = new User[2];
System.out.println(Arrays.asList(array));
конечно, если вы настроили user.toString()
Вы не можете этого сделать. Когда вы объявляете массив, тогда Java фактически создает скрытый объект типа Array. Это особый тип класса (например, он поддерживает оператор access access []), к которому обычный код не может напрямую обращаться.
Если вы хотите переопределить toString(), вам придется расширить этот класс. Но вы не можете этого сделать, поскольку он скрыт.
Я думаю, что так хорошо. Если бы можно было расширить класс Array, тогда можно было бы добавлять туда всевозможные методы. И когда кто-то другой управляет этим кодом, они видят собственные методы в массивах, и они "WTF... Это С++ или что?".
Ну, вы можете попытаться объединить все вызовы Object.toString
с AspectJ вокруг advice и вернуть желаемый результат для массивов. Однако я не думаю, что это хорошее решение:)