Pergunta

Eu estou usando o NetBeans. Quando eu executar o programa abaixo, eu recebo isso como [I@de6ced saída! Como assim?

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

Eu também tentei trabalhar em torno dele, mas então eu tenho um

Exception in thread "main" java.lang.ClassCastException: [I não pode ser convertido para java.lang.Integer em TopCoder.Test.main (Test.java:13) Resultado 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);
}
Foi útil?

Solução

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

As obras acima como seria de esperar.

Portanto, parece que a matriz "int" é tratado como um objeto e não um array de inteiros. Em outras palavras auto boxe não parece ser aplicada a ele?

Outras dicas

[I@de6ced pode ser dividido como:
- [ um array
- I de inteiros
- de6ced com este referência hash código (que, no Sun Java, é basicamente o de referência)

toString () para retornos objeto somethine como ClassName @ HashCode, que é exatamente o que você está vendo acontecer aqui apenas com as (em vez estranhas) classes de matriz primitivo.

O problema é que o tipo errado está sendo inferido pelo método <T> List<T> asList(T...). Alterar seu código para uso Integer[] vez de int[]. Isto é uma consequência do int sendo primitivo, mas int [] é um objecto.

Você pode ver isso diretamente:

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

=> [[I@ alguma referência

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

=> 5

Eu acho que eu descobri o que estava acontecendo:

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

Agora temos um array de int.

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

O problema está na forma como você está chamando Arrays.asList.

A assinatura para asList é "public static <T> List<T> asList(T... a)". Ela não se aplica com T == int porque int não é um tipo de objeto. E não pode combinar com T == Integer porque o tipo base do a matriz é int não Integer. O que realmente está acontecendo é que T é vinculativo para int[] e Arrays.aslist(a) está retornando um List<int[]> com um elemento que é o valor de a !!!

Em seguida, você cria um Vector do List e obter um Vector com um elemento ... o int[] original que foi atribuído a 'a'.

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

Finalmente, a1.elementAt(0) busca o int[], e você acaba chamando a implementação Object do método toString().

Um par de importante lição a aprender com isso:

  • é uma má idéia para misturar tipos de matérias-primas e tipos genéricos como você faz na linha que declara a1, e
  • é uma má idéia para ignorar, ou por sua vez, off genérico tipo de segurança do compilador avisos

Parece que os do int estão se tornando inteiros usando autoboxing então você está recebendo uma referência de objeto em vez do valor. Ainda parece estranho que deve chamar o toString correta e acabar com "5".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top