Я получаю эти странные символы, когда пытаюсь распечатать векторный элемент!

StackOverflow https://stackoverflow.com/questions/1230842

  •  22-07-2019
  •  | 
  •  

Вопрос

Я использую Netbeans.Когда я запускаю программу ниже, я получаю это как результат [I@de6ced!Почему?

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

Я также пытался обойти это, но потом получил

Исключение в потоке «основной» java.lang.ClassCastException:Меня нельзя бросить в java.lang.integer на topcoder.test.main (test.java:13) 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);
}
Это было полезно?

Решение

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

Вышеуказанное работает так, как вы ожидаете.

Так что это выглядит как " int " массив обрабатывается как объект, а не как массив целых чисел. Другими словами, авто бокс не применяется к нему?

Другие советы

[I@de6ced можно разбить как:
- [ массив
- I целых чисел
- de6ced с этим ссылка хэш-код (который в Sun Java по сути является ссылкой)

toString() для Object возвращает что-то вроде ClassName@HashCode, и это именно то, что вы видите здесь, только с (довольно странными) классами примитивных массивов.

Проблема в том, что неправильный тип выводится <T> List<T> asList(T...) метод.Измените свой код для использования Integer[] вместо int[].Это следствие того, что int является примитивным, но int[] является объектом.

Вы можете увидеть это непосредственно:

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

=> [[I@некоторая ссылка

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

=> 5

Кажется, я понял, что происходит:

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

Теперь у нас есть массив int.

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

Проблема в том, как вы звоните Arrays.asList.

Подпись для asList: "public static <T> List<T> asList(T... a)".Это не относится к T == int потому что int не является типом объекта.И оно не может совпадать с T == Integer потому что базовый тип массива a является int нет Integer.На самом деле происходит то, что T является обязательным для int[], и Arrays.aslist(a) возвращает List<int[]> с одним элементом, который является значением a!!!

Затем вы создаете Vector из List и получить Vector с одним элементом...оригинал int[] это было присвоено букве «а».

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

Окончательно, a1.elementAt(0) приносит int[], и в конечном итоге вы вызываете Object осуществление toString() метод.

Из этого можно извлечь несколько важных уроков:

  • Это плохая идея смешивать необработанные типы и общие типы, как вы делаете на линии, которая объявляет a1, и
  • Это плохая идея игнорировать или выключить предупреждения компилятора об общих типах

Похоже, что int становятся целыми числами, используя автобокс, поэтому вы получаете ссылку на объект вместо значения. Все еще кажется странным, так как он должен вызывать правильный toString и заканчиваться на & Quot; 5 & Quot;.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top