当我尝试打印出一个矢量元素时,我得到了这些奇怪的字符!

时间:2009-08-05 02:08:39

标签: java syntax autoboxing

我正在使用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 个答案:

答案 0 :(得分:6)

[I@de6ced可以细分为:
  - [数组
  - I整数
  - de6ced使用此引用哈希代码(在Sun Java中,基本上是参考)

Object的

toString()返回类似ClassName @ HashCode的东西,这正是你在这里发现的(相当奇怪的)原始数组类。

问题是<T> List<T> asList(T...)方法推断出错误的类型。将代码更改为使用Integer[]而不是int[]。这是int是原始的结果,但int []是一个对象。

您可以直接看到:

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

=&GT; [[I@ 一些参考

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

=&GT; 5

答案 1 :(得分:2)

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

以上工作正如您所期望的那样。

因此看起来“int”数组被视为Object而不是Integers数组。换句话说,自动拳击似乎不适用于它?

答案 2 :(得分:0)

我想我已经弄清楚发生了什么:

 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
  • 忽略或转向是个坏主意 关闭编译器的泛型类型安全性 警告

答案 3 :(得分:-1)

看起来int正在变成使用自动装箱的整数,所以你得到一个对象引用而不是值。仍然看起来很奇怪,因为它应该调用正确的toString并最终得到“5”。