J'obtiens ces personnages étranges lorsque j'essaie d'imprimer un élément vectoriel!

StackOverflow https://stackoverflow.com/questions/1230842

  •  22-07-2019
  •  | 
  •  

Question

J'utilise Netbeans. Lorsque je lance le programme ci-dessous, je l’obtenir en sortie [I@de6ced! Comment ça se fait?

import java.util.Arrays;
import java.util.Vector;

public class Test {

public static void main (String[] args) {
     int[] a = new int[1];
     a[0] = 5;
     Vector<Integer> a1 = new Vector(Arrays.asList(a));
     System.out.println(a1.elementAt(0));
 }
}

J'ai aussi essayé de travailler autour de ça, mais j'ai eu un

Exception dans le fil " principal " java.lang.ClassCastException: [Je ne peux pas être transtypé en java.lang.Integer         sur TopCoder.Test.main (Test.java:13) Résultat Java: 1

public static void main (String[] args) {
    int[] a = new int[1];
    a[0] = 5;
    Vector<Integer> a1 = new Vector(Arrays.asList(a));

    int b = a1.elementAt(0); /* EXCEPTION THROWN HERE */
    System.out.println(b);
}
Était-ce utile?

La solution

Integer[] a = new Integer[1];
a[0] = new Integer(5);
List list = Arrays.asList(a);
System.out.println(list.get(0));

Ce qui précède fonctionne comme prévu.

Cela ressemble donc au " int " array est traité comme un objet et non comme un tableau d'entiers. Autrement dit, la boxe automatique ne semble pas lui être appliquée?

Autres conseils

[I@de6ced peut être décomposé en:
 - [ un tableau
 - I d'entiers
 - de6ced avec cette référence hash-code (qui, en gros, est la référence de Sun Java)

toString () pour Object retourne quelque chose comme ClassName @ HashCode, ce qui est exactement ce que vous voyez se produire ici avec les classes (plutôt étranges) primitives-array.

Le problème est que le type incorrect est induit par la méthode <T> List<T> asList(T...). Modifiez votre code pour utiliser Integer[] au lieu de int[]. C’est une conséquence de la primitive d’int, mais int [] est un objet.

Vous pouvez voir cela directement:

System.out.println(Arrays.asList(new int[]{5}));

= > [[I@ une référence

System.out.println(Arrays.asList(new Integer[]{5}).get(0));

= > 5

Je pense avoir compris ce qui se passait:

 int[] a = new int[1];
 a[0] = 5;

Nous avons maintenant un tableau d'int.

 Vector<Integer> a1 = new Vector(Arrays.asList(a));

Le problème réside dans la façon dont vous appelez Arrays.asList.

La signature pour asList est & "; public static <T> List<T> asList(T... a) &". Cela ne s'applique pas à T == int car int n'est pas un type d'objet. Et cela ne peut pas correspondre à T == Integer car le type de base du tableau a est Integer pas T. Ce qui se passe réellement est que int[] est lié à Arrays.aslist(a), et List<int[]> renvoie un Vector avec un élément qui correspond à la valeur List !!!

Vous créez ensuite un a1.elementAt(0) à partir du Object et vous obtenez un toString() avec un élément ... l'original a1 affecté à 'a'.

 System.out.println(a1.elementAt(0));

Enfin, <=> récupère le <=>, et vous appelez l’implémentation <=> de la méthode <=>.

Quelques leçons importantes à tirer de cela:

  • c’est une mauvaise idée de mélanger des types bruts et types génériques comme vous le faites sur la ligne qui déclare <=> et
  • c'est une mauvaise idée d'ignorer ou de tourner hors du type générique du compilateur avertissements

Il semble que les entiers deviennent des entiers à l'aide de la sélection automatique afin que vous obteniez une référence d'objet au lieu de la valeur. Cela semble toujours bizarre car il devrait appeler la chaîne correcte toString et se retrouver avec & "5 &";.

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top