J’obtiens ceci quand je l’appelle `` sur un objet que j’ai reçu un appel de fonction. Je sais que le type de l’objet est encodée dans cette chaîne, mais je ne sais pas comment la lire. Quel est ce type de codage appelé ?
Réponse
Trop de publicités?[Ljava.lang.Object;
est le nom d' Object[].class
, java.lang.Class
représentant la classe de tableau de Object
.
Le schéma de nommage est documenté en Class.getName()
:
Si cet objet de classe représente un type de référence qui n'est pas de type tableau, puis le nom binaire de la classe est retournée, comme spécifié par le Langage Java Specification (§13.1).
Si cet objet de classe représente un type primitif ou
void
, puis le nom retourné est le langage Java mot-clé correspondant au type primitif ouvoid
.Si cet objet de classe représente une classe d'ensembles, puis la forme interne de la le nom est composé du nom de l'élément de type précédé d'un ou de plus d'
'['
caractères représentant la profondeur de la matrice de nidification. Le codage de l'élément type de noms est comme suit:Element Type Encoding boolean Z byte B char C double D float F int I long J short S class or interface Lclassname;
Voici quelques exemples:
// xxxxx varies
System.out.println(new int[0][0][7]); // [[[I@xxxxx
System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx
System.out.println(new boolean[256]); // [Z@xxxxx
La raison pour laquelle le toString()
méthode sur les tableaux des rendements String
dans ce format est parce que les tableaux n' @Override
la méthode héritée de Object
, ce qui est spécifié comme suit:
L'
toString
méthode pour la classeObject
retourne une chaîne constituée du nom de la classe dont l'objet est une instance, le signe `@', et non signés représentation hexadécimale du code de hachage de l'objet. En d'autres termes, cette méthode renvoie une chaîne de caractères correspondant à la valeur de:getClass().getName() + '@' + Integer.toHexString(hashCode())
Remarque: vous ne pouvez pas compter sur l' toString()
de n'importe quel objet de suivre les spécifications ci-dessus, car ils peuvent (et le font habituellement) @Override
il pour revenir à quelque chose d'autre. Le moyen plus fiable de l'inspection du type de l'arbitraire d'un objet est d'invoquer getClass()
(un final
méthode héritée de Object
) et puis en réfléchissant sur le retour de l' Class
objet. Idéalement, cependant, l'API ai été conçu de telle sorte que la réflexion n'est pas nécessaire (voir Effective Java 2nd Edition, Point 53: Préférer les interfaces à la réflexion).
Sur un plan plus "utile" toString
pour les tableaux
java.util.Arrays
fournit toString
surcharges pour des primitifs tableaux et Object[]
. Il est également deepToString
que vous pouvez utiliser pour les tableaux imbriqués.
Voici quelques exemples:
int[] nums = { 1, 2, 3 };
System.out.println(nums);
// [I@xxxxx
System.out.println(Arrays.toString(nums));
// [1, 2, 3]
int[][] table = {
{ 1, },
{ 2, 3, },
{ 4, 5, 6, },
};
System.out.println(Arrays.toString(table));
// [[I@xxxxx, [I@yyyyy, [I@zzzzz]
System.out.println(Arrays.deepToString(table));
// [[1], [2, 3], [4, 5, 6]]
Il y a aussi Arrays.equals
et Arrays.deepEquals
qui effectuent de la matrice de comparaison d'égalité par leurs éléments, parmi beaucoup d'autres tableau liées à l'utilité des méthodes.
Questions connexes
- Java Les Tableaux.equals() renvoie la valeur false pour les deux dimensions des tableaux. -- une couverture en profondeur