Ich erhalte diese seltsamen Zeichen, wenn ich versuche, ein Vektorelement zu drucken!
-
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);
}
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.