Ottengo questi strani personaggi quando provo a stampare un elemento vettoriale!
-
22-07-2019 - |
Domanda
Sto usando Netbeans.
Quando eseguo il programma di seguito, ottengo questo come output [I@de6ced
! Come mai?
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));
}
}
Ho anche provato a risolverlo ma poi ho ricevuto
Eccezione nel thread " main " java.lang.ClassCastException: [Non riesco a trasmettere a java.lang.Integer su TopCoder.Test.main (Test.java:13) Risultato 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);
}
Soluzione
Integer[] a = new Integer[1];
a[0] = new Integer(5);
List list = Arrays.asList(a);
System.out.println(list.get(0));
Quanto sopra funziona come ti aspetteresti.
Quindi sembra che " int " l'array viene trattato come un oggetto e non come un array di numeri interi. In altre parole, il pugilato automatico non sembra essere applicato ad esso?
Altri suggerimenti
[I@de6ced
può essere suddiviso in:
- [
un array
- I
di numeri interi
- de6ced
con questo riferimento hash-code (che, in Sun Java, è fondamentalmente il riferimento)
toString () per Object restituisce qualcosa come ClassName @ HashCode, che è esattamente ciò che stai vedendo accadere qui solo con le classi (piuttosto strane) di array primitivo.
Il problema è che il tipo errato viene dedotto dal metodo <T> List<T> asList(T...)
. Modifica il codice per utilizzare Integer[]
anziché int[]
. Questa è una conseguenza del fatto che int è primitivo, ma int [] è un oggetto.
Puoi vederlo direttamente:
System.out.println(Arrays.asList(new int[]{5}));
& = gt; [[I@
alcuni riferimenti
System.out.println(Arrays.asList(new Integer[]{5}).get(0));
& = gt; 5
Penso di aver capito cosa stava succedendo:
int[] a = new int[1];
a[0] = 5;
Ora abbiamo una serie di int.
Vector<Integer> a1 = new Vector(Arrays.asList(a));
Il problema è nel modo in cui stai chiamando Arrays.asList
.
La firma per asList è " public static <T> List<T> asList(T... a)
" ;. Non si applica con T == int
perché int
non è un tipo di oggetto. E non può corrispondere con T == Integer
perché il tipo di base dell'array a
è Integer
non T
. Quello che sta realmente accadendo è che int[]
è vincolante per Arrays.aslist(a)
e List<int[]>
sta restituendo un Vector
con un elemento che è il valore di List
!!!
Quindi si crea un a1.elementAt(0)
da Object
e si ottiene un toString()
con un elemento ... l'originale a1
assegnato a 'a'.
System.out.println(a1.elementAt(0));
Infine, <=> recupera il <=> e finisci per chiamare <=> l'implementazione del metodo <=>.
Un paio di lezioni importanti da imparare da questo:
- è una cattiva idea mescolare tipi grezzi e tipi generici come fai sulla linea che dichiara <=> e
- è una cattiva idea ignorare o girare dalla generica sicurezza del tipo del compilatore avvertenze
Sembra che gli int stiano diventando numeri interi usando l'autoboxing, quindi stai ottenendo un riferimento all'oggetto invece del valore. Sembra ancora strano come dovrebbe chiamare il toString corretto e finire con & Quot; 5 & Quot ;.