Comment voir si un object est un tableau sans utiliser la reflection?

Comment puis-je voir en Java si un object est un tableau sans utiliser de reflection? Et comment puis-je parcourir tous les éléments sans utiliser de reflection?

J’utilise Google GWT donc je ne suis pas autorisé à utiliser la reflection 🙁

J’aimerais mettre en œuvre les méthodes suivantes sans utiliser la refelection:

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

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

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 object et primitif.

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

Vous pouvez utiliser instanceof .

JLS 15.20.2 Comparaison de type Operator instanceof

  RelationalExpression: RelationalExpression instanceof ReferenceType 

Au moment de l’exécution, le résultat de l’opérateur instanceof est true si la valeur de RelationalExpression n’est pas null et que la référence peut être ClassCastException dans le ReferenceType sans ClassCastException une ClassCastException . Sinon, le résultat est false .

Cela signifie que vous pouvez faire quelque chose comme ceci:

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

Vous devriez vérifier si l’object est une 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 une instanceof Object[] , ce qui peut compliquer la manière dont vous souhaitez gérer les tableaux nesteds.

Pour toSsortingng , java.util.Arrays a un toSsortingng(int[]) et d’autres surcharges que vous pouvez utiliser. Il possède également deepToSsortingng(Object[]) pour les tableaux nesteds.

 public Ssortingng toSsortingng(Object arr) { if (arr instanceof int[]) { return Arrays.toSsortingng((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 comme ça en Java avec les tableaux.

Voir également

  • Gestion de code et de documentation hautement répétitifs en Java
  • Java Arrays.equals () renvoie false pour les tableaux à deux dimensions.

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 

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

Il n’y a pas de relation de sous-typage entre les tableaux de type primitif ou entre un tableau d’un type primitif et un tableau d’un type de référence. Voir JLS 4.10.3 .

Par conséquent, le test suivant est incorrect pour voir si obj est un tableau quelconque :

 // 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 pour les tableaux primitifs avec des dimensions plus élevées, car tous les types de tableaux sont des sous-types d’ Object . Mais cela est discutable dans ce cas.)

J’utilise Google GWT donc je ne suis pas autorisé à utiliser la reflection 🙁

La meilleure solution (à la partie du tableau isArray de la question) dépend de ce qui compte comme “utilisant la reflection”.

  • Si vous appelez obj.getClass().isArray() ne compte pas comme utilisant la reflection, alors c’est la meilleure solution.

  • Sinon, la meilleure façon de déterminer si un object a un type tableau est d’utiliser une séquence d’expressions d’ instanceof .

     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 contourner le nom de la classe de l’object comme suit, mais l’appel à obj.getClass() est obj.getClass() de la reflection.

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