Recebo esses caracteres estranhos quando tento imprimir um elemento do vetor!
-
22-07-2019 - |
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);
}
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".