Я получаю эти странные символы, когда пытаюсь распечатать элемент вектора! - PullRequest
2 голосов
/ 05 августа 2009

Я использую 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));
 }
}

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

Исключение в потоке "main" 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);
}

Ответы [ 4 ]

6 голосов
/ 05 августа 2009

[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

2 голосов
/ 05 августа 2009
Integer[] a = new Integer[1];
a[0] = new Integer(5);
List list = Arrays.asList(a);
System.out.println(list.get(0));

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

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

0 голосов
/ 05 августа 2009

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

 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[], который был присвоен 'a'.

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

Наконец, a1.elementAt(0) извлекает int[], и в итоге вы вызываете реализацию Object метода toString().

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

  • плохая идея смешивать необработанные типы и общие типы, как вы делаете на линии который объявляет a1 и
  • это плохая идея, игнорировать или поворачивать от общей безопасности типов компилятора предупреждения
0 голосов
/ 05 августа 2009

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

...