Ich erhalte diese seltsamen Zeichen, wenn ich versuche, ein Vektorelement zu drucken!

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

  •  22-07-2019
  •  | 
  •  

Frage

Ich benutze Netbeans. Wenn ich das Programm unten laufen, bekomme ich diese als Ausgabe [I@de6ced! Wie kommt das?

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));
 }
}

Ich habe auch versucht, um daran zu arbeiten, aber dann bekam ich ein

Exception in thread "main" java.lang.ClassCastException: [Ich kann nicht auf java.lang.Integer gegossen werden         bei TopCoder.Test.main (Test.java:13) Java Ergebnis: 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);
}
War es hilfreich?

Lösung

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

Die oben genannten Arbeiten, wie Sie es erwarten würden.

So sieht es aus wie das „int“ Array wie ein Objekt behandelt wird und nicht ein Array von ganzen Zahlen. Mit anderen Worten Autoboxen scheint nicht auf sie angewendet zu werden?

Andere Tipps


:

[I@de6ced kann sich wie gebrochen werden  - [ ein Array
 - I von ganzen Zahlen
 - de6ced mit diesem Referenz Hash-Code (die in Sun Java, ist im Grunde die Referenz)

toString () für Objekt zurückgibt somethine wie Klassennamen @ HashCode, das ist genau das, was Sie sehen hier nur geschehen mit dem (eher wierd) primitiv-Array-Klassen.

Das Problem ist, dass die falsche Art wird durch die <T> List<T> asList(T...) Verfahren abgeleitet werden. Ändern Sie den Code Integer[] statt int[] zu verwenden. Dies ist eine Folge von int primitiv zu sein, aber int [] ist ein Objekt.

Sie können dies direkt sehen:

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

=> [[I@ einige Referenz

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

=> 5

Ich glaube, ich habe herausgefunden, was passiert war:

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

Wir haben jetzt eine Reihe von int.

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

Das Problem ist in der Art und Weise Sie Arrays.asList anrufen.

Die Signatur für asList ist "public static <T> List<T> asList(T... a)". Sie gilt nicht mit T == int weil int nicht ein Objekttyp ist. Und es kann nicht mit T == Integer überein, da der Basistyp des Arrays a ist int nicht Integer. Was tatsächlich passiert ist, dass T ist die Bindung an int[] und Arrays.aslist(a) ein List<int[]> mit einem Element zurückkehrt, dass der Wert von a ist !!!

Sie dann eine Vector aus dem List erstellen und ein Vector mit einem Elemente ... das Original int[] erhalten, die zu 'a' zugewiesen wurde.

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

Schließlich holt a1.elementAt(0) die int[] und Sie die Object Umsetzung der toString() Aufruf der Methode beenden.

Ein paar wichtige Lektion daraus lernen:

  • es ist eine schlechte Idee rohe Typen zu mischen und generische Typen, wie Sie auf der Linie zu tun dass erklärt a1 und
  • es ist eine schlechte Idee zu ignorieren, oder wiederum Aus dem gattungsbildenden Art-Sicherheit des Compilers Warnungen

Es sieht aus wie die int Die ganzen Zahlen sind immer mit Autoboxing, so dass Sie einen Objektverweis anstelle des Wertes zu bekommen. Dennoch scheint seltsam, wie es den richtigen toString nennen sollte und mit „5“ enden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top