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);
}
È stato utile?

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 ;.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top