Pregunta

Estoy usando Netbeans.Cuando ejecuto el programa siguiente, tengo esta como salida [I@de6ced!¿Cómo ven?

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

También he tratado de trabajar alrededor de él, pero luego me puse un

Excepción en el thread "main" java.lang.ClassCastException:[No puedo ser echado a java.lang.Entero en TopCoder.Prueba.principal(de Prueba.java:13) Java Resultado: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);
}
¿Fue útil?

Solución

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

Lo anterior funciona como es de esperar.

Entonces parece que " int " La matriz se trata como un objeto y no como una matriz de enteros. En otras palabras, ¿parece que no se le aplica el boxeo automático?

Otros consejos

[I@de6ced puede desglosarse como:
 - [ una matriz
 - I de enteros
 - de6ced con esta referencia código hash (que, en Sun Java, es básicamente la referencia)

toString () para Object devuelve algo como ClassName @ HashCode, que es exactamente lo que está viendo suceder aquí solo con las clases de matriz primitiva (bastante extrañas).

El problema es que el método <T> List<T> asList(T...) infiere el tipo incorrecto. Cambie su código para usar Integer[] en lugar de int[]. Esto es consecuencia de que int es primitivo, pero int [] es un objeto.

Puedes ver esto directamente:

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

= > [[I@ alguna referencia

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

= > 5

Creo que he descubierto lo que estaba sucediendo:

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

Ahora tenemos un array de int.

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

El problema está en la forma en la que está llamando Arrays.asList.

La firma de asList es "public static <T> List<T> asList(T... a)".No se aplica con T == int porque int no es un tipo de objeto.Y no coincide con T == Integer debido a que el tipo base de la matriz a es int no Integer.Lo que realmente está sucediendo es que T es vinculante para int[], y Arrays.aslist(a) es la devolución de un List<int[]> con un elemento que es el valor de a!!!

A continuación, puede crear un Vector a partir de la List y obtener una Vector con uno de los elementos ...el original int[] que fue asignado a la 'a'.

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

Finalmente, a1.elementAt(0) recupera el int[], y al final llama a la Object la aplicación de la toString() método.

Un par de lección importante que aprender de esto:

  • es una mala idea mezclar primas y tipos de los tipos genéricos como en el de la línea de que declara a1, y
  • es una mala idea ignorar, o girar a la fuera el compilador del tipo genérico de seguridad advertencias

Parece que los int se están convirtiendo en números enteros usando el autoboxing, por lo que está obteniendo una referencia de objeto en lugar del valor. Todavía parece extraño, ya que debería llamar al toString correcto y terminar con & Quot; 5 & Quot ;.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top