111 votes

Comment voir si un objet est un tableau sans utiliser la réflexion ?

Comment puis-je voir en Java si un objet est un tableau sans utiliser la réflexion ? Et comment puis-je itérer à travers tous les éléments sans utiliser la réflexion ?

J'utilise Google GWT donc je ne suis pas autorisé à utiliser la réflexion :(

J'aimerais mettre en œuvre les méthodes suivantes sans utiliser la réflection :

private boolean isArray(final Object obj) {
  //??..
}

private String toString(final Object arrayObject) {
  //??..
}

BTW : je ne veux pas non plus utiliser JavaScript de telle sorte que je puisse l'utiliser dans des environnements non-GWT.

280voto

Steve Kuo Points 15196

Vous pouvez utiliser Class.isArray()

public static boolean isArray(Object obj)
{
    return obj!=null && obj.getClass().isArray();
}

Cela fonctionne à la fois pour les tableaux de type objet et de type primitif.

Pour toString, regardez Arrays.toString . Vous devrez vérifier le type de tableau et appeler la méthode appropriée. toString méthode.

73voto

polygenelubricants Points 136838

Vous pouvez utiliser instanceof .

JLS 15.20.2 Opérateur de comparaison de types instanceof

 RelationalExpression:
    RelationalExpression instanceof ReferenceType

Au moment de l'exécution, le résultat de la instanceof L'opérateur est true si la valeur de la Expression relationnelle n'est pas null et la référence pourrait être coulée dans le Type de référence sans soulever un ClassCastException . Sinon, le résultat est false .

Cela signifie que vous pouvez faire quelque chose comme ça :

Object o = new int[] { 1,2 };
System.out.println(o instanceof int[]); // prints "true"        

Il faudrait vérifier si l'objet est un instanceof boolean[] , byte[] , short[] , char[] , int[] , long[] , float[] , double[] ou Object[] si vous voulez détecter tous les types de tableaux.

En outre, un int[][] est un instanceof Object[] En fonction de la façon dont vous voulez gérer les tableaux imbriqués, cela peut devenir compliqué.

Pour le toString , java.util.Arrays a un toString(int[]) et d'autres surcharges que vous pouvez utiliser. Il dispose également de deepToString(Object[]) pour les tableaux imbriqués.

public String toString(Object arr) {
   if (arr instanceof int[]) {
      return Arrays.toString((int[]) arr);
   } else //...
}

Cela va être très répétitif (mais même java.util.Arrays est très répétitif ), mais c'est ainsi que cela se passe en Java avec les tableaux.

Voir aussi

40voto

user1928596 Points 54

On peut accéder à chaque élément d'un tableau séparément en utilisant le code suivant :

Object o=...;
if ( o.getClass().isArray() ) {
    for(int i=0; i<Array.getLength(o); i++){
        System.out.println(Array.get(o, i));
    }
}

Notez qu'il n'est pas nécessaire de savoir quel type de tableau sous-jacent il s'agit, car cela fonctionnera pour n'importe quel tableau.

10voto

Stephen C Points 255558

Il n'existe pas de relation de sous-typage entre les tableaux de type primitif, ou entre un tableau de type primitif et un tableau de type référence. Voir JLS 4.10.3 .

Par conséquent, ce qui suit est incorrect en tant que test pour voir si obj est un tableau de toute sorte :

// INCORRECT!
public boolean isArray(final Object obj) {
    return obj instanceof Object[];
}

Plus précisément, cela ne fonctionne pas si obj est un tableau 1-D de primitives. (Cela fonctionne cependant pour les tableaux de primitives de dimensions supérieures, car tous les types de tableaux sont des sous-types de Object . Mais elle est sans objet dans cette affaire).

J'utilise Google GWT donc je ne suis pas autorisé à utiliser la réflexion :(

La meilleure solution (pour le isArray La partie "tableau" de la question) dépend de ce que l'on entend par "utiliser la réflexion".

  • Dans GWT, l'appel obj.getClass().isArray() ne compte pas comme utilisant la réflexion 1 C'est donc la meilleure solution.

  • Sinon, le meilleur moyen de savoir si un objet est de type tableau est d'utiliser une séquence de instanceof expressions.

    public boolean isArray(final Object obj) {
        return obj instanceof Object[] || obj instanceof boolean[] ||
           obj instanceof byte[] || obj instanceof short[] ||
           obj instanceof char[] || obj instanceof int[] ||
           obj instanceof long[] || obj instanceof float[] ||
           obj instanceof double[];
    }
  • Vous pouvez également essayer de modifier le nom de la classe de l'objet comme suit, mais l'appel à la fonction obj.getClass() est à la limite de la réflexion.

    public boolean isArray(final Object obj) {
        return obj.getClass().toString().charAt(0) == '[';
    }

1 - Plus précisément, le Class.isArray est listée comme étant supportée par GWT dans cette page .

0voto

Sina Madani Points 532

Tout simplement obj instanceof Object[] (testé sur JShell).

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