当我尝试打印向量元素时,我得到这些奇怪的字符!
-
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));
}
}
我也尝试过解决它,但后来我得到了
线程“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
因为数组的基类型 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
, , 和 - 忽略或关闭编译器的通用类型安全警告是一个坏主意
它看起来像廉政局正在成为使用自动装箱所以你得到一个对象引用,而不是值的整数。似乎仍然不可思议,因为它应该调用正确的toString并用“5”结束。