¿Es posible en Java sobrescribir ‘toString’ para una matriz de Objetos?

¿Es posible en Java sobrescribir un toString para una matriz de Objetos?

Por ejemplo, digamos que creé una clase simple, User (realmente no importa qué clase es, ya que esta es una pregunta general). ¿Es posible que, una vez que el cliente cree una matriz User[] y el cliente use System.out.print(array) , no imprima la dirección de la matriz, sino que una personalizada toString() ?

PD: por supuesto, no puedo anular toString() en mi clase porque está relacionado con instancias únicas.

No. Por supuesto, puede crear un método estático User.toString (User []), pero no se llamará implícitamente.

Puede usar Arrays.toString(Object[] a); que llamará al método toString() en cada objeto de la matriz.

Editar (del comentario):

Entiendo qué es lo que intentas lograr, pero Java no lo admite en este momento.

En Java, las matrices son objetos que se crean dinámicamente y se pueden asignar a variables de tipo Object. Todos los métodos de clase Object pueden invocarse en una matriz. Ver JLS Ch10

Cuando invocas toString() en un objeto, devuelve una cadena que “representa textualmente” el objeto. Debido a que una matriz es una instancia de Objeto, es por eso que solo obtiene el nombre de la clase, el @ y un valor hexadecimal. Ver Object # toString

El método Arrays.toString () devuelve el equivalente de la matriz como una lista, que se itera sobre y toString() llamado a cada objeto en la lista.

Entonces, aunque no podrá hacer System.out.println(userList); puede hacer System.out.println(Arrays.toString(userList); que esencialmente logrará lo mismo.

Puede crear una clase separada que contenga la matriz y anular toString() .

Creo que la solución más simple es extender la clase ArrayList y simplemente anular toString() (por ejemplo, UserArrayList ).

La única forma en que puede hacer esto es volver a comstackr Object.toString() y agregar cláusulas instanceof .

Solicité un cambio en Project Coin para manejar matrices de una manera más orientada a objetos. Sentí que es demasiado para los principiantes aprender toda la funcionalidad que necesita en Array, Arrays y otras 7 clases de ayuda que se usan comúnmente.

Creo que al final se concluyó que hacer matrices orientadas a objetos es una tarea no trivial que se retrotraerá a Java 9 o posterior.

Prueba esto

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

de grueso si tiene el user.toString() personalizado user.toString()

Usted no puede hacer eso. Cuando declaras una matriz, Java crea un objeto oculto de tipo Array. Es un tipo especial de clase (por ejemplo, admite el operador de acceso de índice []) al que el código normal no puede acceder directamente.

Si quisiera sobrescribir toString (), debería extender esta clase. Pero no puedes hacerlo, ya que está escondido.

Creo que es bueno ser así. Si uno pudiera extender la clase Array, entonces podría agregar todo tipo de métodos allí. Y cuando alguien más maneja este código, ven métodos personalizados en las matrices y son “WTF … ¿Es esto C ++ o qué?”.

Bueno, puede tratar de ajustar todas las llamadas a Object.toString con un AspectJ en torno a los consejos y devolver el resultado deseado para las matrices. Sin embargo, no creo que sea una buena solución 🙂