2009-08-05 7 views
2

J'utilise Netbeans. Lorsque j'exécute le programme ci-dessous, j'obtiens ceci comme sortie [[email protected]! Comment venir?Je reçois ces caractères étranges quand j'essaie d'imprimer un élément de vecteur!

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 d'elle, mais ensuite je me suis un

Exception dans le thread « principal » java.lang.ClassCastException: [Je ne peux pas être jeté à java.lang.Integer à TopCoder.Test .main (Test.java:13) Java Résultat: 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); 
} 
+0

Vous pouvez utiliser la mise en œuvre vararg de Arrays.asList pour éviter le tableau int : Vecteur a1 = nouveau Vecteur (Arrays.asList (5)); – KitsuneYMG

+0

http://stackoverflow.com/questions/1040868/java-syntax-and-meaning-behind-b1ef9157-binary-address – erickson

Répondre

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

Les travaux ci-dessus que vous attendez. Il semble donc que le tableau "int" est traité comme un objet et non comme un tableau de nombres entiers. En d'autres termes, la boxe automatique ne semble pas être appliquée à elle?

+0

Oh merci! Ça a marché ! J'ai changé int [] a = new int [1]; à Integer [] a = new Entier [1] ;. Je vous remercie !!!! – user126356

+1

C'est méchant. Autoboxing est agréable quand cela fonctionne, mais quand ce n'est pas le cas (comme dans le cas présent), cela rend le comportement difficile à comprendre (et les questions pièges de SCJP). Probablement un résultat de l'autoboxing (et varargs et génériques) étant ajouté à la langue assez tard. Si cela avait été à Java depuis le début, ces ambiguïtés auraient pu être évitées. – Thilo

-1

Il semble que les INT deviennent entiers à l'aide autoboxing afin que vous obtenez une référence d'objet au lieu de la valeur. Cela semble encore bizarre car cela devrait appeler la bonne chaîne et se terminer par "5".

+0

Mauvaise réponse. La classe Integer redéfinit toString() pour vous donner la forme String de la valeur. Donc, vous devriez voir "5". –

6

[[email protected] peuvent être répartis comme:
- [ un tableau
- I des entiers
- de6ced avec cette référence hachage code (qui, Sun Java, est fondamentalement la référence)

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

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

Vous pouvez le voir directement:

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

=>[[[email protected]une référence

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

=>5

+0

+1 pour avoir remarqué que le code fourni ne correspond pas au comportement signalé! –

+0

Je suis sûr que je n'ai rien oublié. C'est la sortie que je reçois quand je compile ce programme ... – user126356

+0

Il y a quelque chose d'étrange avec les génériques/boxing qui se passent là-bas je pense, je reviendrai à vous dans une seconde. –

0

je pense avoir compris ce qui se passait:

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

Nous avons maintenant un tableau de int.

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

Le problème est dans la façon dont vous appelez Arrays.asList.

La signature de asList est "public static <T> List<T> asList(T... a)". Il ne s'applique pas avec T == int car int n'est pas un type d'objet. Et il ne peut pas correspondre avec T == Integer parce que le type de base du tableau a est int pas Integer.Qu'est-ce qui se passe réellement est que T se lie à int[], et Arrays.aslist(a) renvoie un List<int[]> avec un élément qui est la valeur de a !!!

Ensuite, vous créez un Vector du List et obtenir un Vector avec un élément ... l'int[] original qui a été attribué à « a ».

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

Enfin, a1.elementAt(0) va chercher le int[], et vous finissez par appeler la mise en œuvre de la méthode ObjecttoString().

Un couple de leçon à apprendre de ceci:

  • est une mauvaise idée de mélanger les types premières et types génériques comme vous le faites sur la ligne qui déclare a1 et
  • il est une mauvaise idée d'ignorer, ou tourner hors type sécurité générique du compilateur avertissements
+0

donc s'il avait écrit "new Vector (Arrays.asList (a))" ça aurait marché? Ou au moins n'a pas réussi à compiler? – Thilo

+0

@Thilo: il aurait dû recevoir un avertissement de compilation indiquant que le type d'argument réel ne correspond pas au type de paramètre du constructeur. –

+0

@Thilo: en effet, il aurait dû y avoir un avertissement du compilateur pour la version originale, à propos de l'assignation d'un type brut à un type paramétré. –

Questions connexes