我正在使用 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:我不能在topcoder.test.main(test.java:13)java.lang.integer施放到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()为对象返回somethine像类名@ 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 因为数组的基类型 aint 不是 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, , 和
  • 忽略或关闭编译器的通用类型安全警告是一个坏主意

它看起来像廉政局正在成为使用自动装箱所以你得到一个对象引用,而不是值的整数。似乎仍然不可思议,因为它应该调用正确的toString并用“5”结束。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top