Est-il possible en Java de remplacer 'toString' pour un tableau D'objets?

est-il possible en Java de surcharger un toString pour un tableau D'objets?

par exemple, disons que j'ai créé une classe simple, User (peu importe quelle classe il s'agit puisque c'est une question générale). Est-il possible que, une fois que le client crée un tableau User[] et qu'il utilise System.out.print(array) , il n'affiche pas l'adresse du tableau mais plutôt un tableau personnalisé toString() ?

PS: bien sûr, je ne peux pas juste outrepasser toString() dans ma classe puisque c'est lié à des instances simples.

16
demandé sur Peter Mortensen 2012-04-24 13:54:47

7 réponses

Pas de. Bien sûr, vous pouvez créer un utilisateur de méthode statique.toString( Utilisateur[] ), mais il ne sera pas appelé implicitement.

17
répondu Theodore Norvell 2012-04-24 10:00:42

vous pouvez utiliser Arrays.toString(Object[] a); qui appellera la méthode toString() sur chaque objet du tableau.

Modifier (commentaire):

je comprends ce que vous essayez de réaliser, mais Java ne supporte pas cela en ce moment.

en Java, les tableaux sont des objets qui sont créés dynamiquement et peuvent être assignés à des variables de type Objet. Toutes les méthodes d'objet de classe peuvent être invoquées sur un tableau. Voir JLS Ch10

quand vous invoquez toString() sur un objet, il renvoie une chaîne de caractères qui" représente textuellement " l'objet. Car un tableau est une instance de l'Objet qui est pourquoi vous obtenez seulement le nom de la classe, le @ et une valeur hexadécimale. Voir objet#toString

Les Tableaux .toString () méthode retourne l'équivalent du tableau comme une liste, qui est itérée plus et toString() appelé sur chaque objet de la liste.

donc bien que vous ne serez pas en mesure de faire System.out.println(userList); vous pouvez faire System.out.println(Arrays.toString(userList); qui permettra essentiellement la même chose.

9
répondu Deco 2012-04-24 10:32:40

vous pouvez créer une classe séparée contenant le tableau, et remplacer toString() .

je pense que la solution la plus simple est d'étendre la classe ArrayList , et de simplement remplacer toString() (par exemple, UserArrayList ).

4
répondu Jeroen 2012-04-24 19:03:47

la seule façon de faire cela est de recompiler Object.toString() et d'ajouter instanceof clauses.

j'avais demandé un changement de pièce de projet pour manipuler des matrices d'une manière plus orientée objet. J'ai senti que c'est trop pour les débutants d'apprendre toutes les fonctionnalités dont vous avez besoin dans les tableaux, tableaux et 7 autres classes d'assistants qui sont couramment utilisés.

je pense qu'à la fin il a été conclu que faire des tableaux correctement orientés objet est un non-trivial tâche qui sera repoussée vers Java 9 ou au-delà.

3
répondu Peter Lawrey 2012-12-08 18:34:13

Essayez cette

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

de grossier si vous avez personnalisé user.toString() méthode

3
répondu Stan Fad 2015-08-27 19:53:41

vous ne pouvez pas faire ça. Lorsque vous déclarez un tableau, alors Java crée en fait un objet caché de type tableau. Il s'agit d'une classe particulière (par exemple, elle supporte l'opérateur index access []) à laquelle le code normal ne peut pas accéder directement.

Si vous vouliez remplacer toString(), vous devez étendre cette classe. Mais vous ne pouvez pas le faire, car il est caché.

je pense que c'est bon d'être de cette façon. Si on peut étendre la classe Array, alors on peut ajouter toutes sortes de méthodes. Et quand quelqu'un d'autre gère ce code, ils voient des méthodes personnalisées sur les tableaux et ils sont "WTF... Est-ce C++ ou quoi?".

0
répondu Jakub Zaverka 2012-04-24 10:29:46

Eh bien, vous pouvez essayer d'envelopper tous les appels à Object.toString avec un AspectJ autour de conseil et retourner la sortie désirée pour les tableaux. Cependant, je ne pense pas que ce soit une bonne solution:)

0
répondu Anton 2012-04-24 19:09:42