117 votes

Java : ce qui est la suivante : [Ljava.lang.Object ; ?

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é ?

227voto

polygenelubricants Points 136838

[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 ou void.

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 classe Object 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X