2

我正在使用 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 中的异常:[我无法在 TopCoder.Test.main(Test.java:13) Java 结果中转换为 java.lang.Integer: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

4 回答 4

6

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

对象的 toString() 返回类似于 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

于 2009-08-05T02:16:43.007 回答
2
Integer[] a = new Integer[1];
a[0] = new Integer(5);
List list = Arrays.asList(a);
System.out.println(list.get(0));

以上工作如你所料。

所以看起来“int”数组被视为对象而不是整数数组。换句话说,自动装箱似乎不适用于它?

于 2009-08-05T02:29:46.890 回答
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然后,您从 the创建一个List并获得一个带有一个元素的...分配给“a”Vector的原始文件。int[]

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

最后,a1.elementAt(0)获取int[],然后您最终调用该方法的Object实现toString()

可以从中吸取一些重要的教训:

  • 像在声明的行中那样混合原始类型和泛型类型是一个坏主意a1,并且
  • 忽略或关闭编译器的通用类型安全警告是个坏主意
于 2009-08-05T03:52:40.023 回答
-1

看起来 int 正在使用自动装箱成为整数,因此您获得的是对象引用而不是值。仍然看起来很奇怪,因为它应该调用正确的 toString 并以“5”结尾。

于 2009-08-05T02:14:54.647 回答