【发布时间】:2018-03-06 07:08:09
【问题描述】:
我们试图通过SQL 查询从数据库中获取结果,使用hibernate,如果记录存在,它将返回List<Object[]>。但后来我们想把它转换成List<Integer>。因此,我们没有遍历Object[] 列表并继续添加到整数列表,而是尝试了一些东西,示例代码就像
public class ListObjectArrayToListInteger {
public static void main(String[] args) {
Object[] ob1 = {1};
Object[] ob2 = {5};
Object[] ob3 = {9};
List objList = new ArrayList();
objList.add(ob1);
objList.add(ob2);
objList.add(ob3);
//Case - 1
List<Integer> intList = objList;
System.out.println(intList);
//Case - 2
List<Integer> intList = new ArrayList<Integer>();
intList.addAll(objList);
System.out.println(intList);
}
}
我们只尝试从查询中获取一列,这就是为什么所有Arrays 都只有一个元素。 Case-1 和 Case-2 都是分别执行的,两种情况下的输出都是一样的,是这样的
[[Ljava.lang.Object;@3e25a5, [Ljava.lang.Object;@19821f, [Ljava.lang.Object;@addbf1]
在Case-1中,intList 类型为List<Integer>,指向List 和Object[]s 的对象。由于数据类型完全不同,我们期待在运行时出现异常。
在 Case-2 中,我们明确地将 Object[]s 添加到 List<Integer> 中,并且无一例外地给出了据我所知的输出。
- 那么任何人都可以解释为什么我们会得到这样的输出吗?
-
List<Integer>(在其所有位置都只期望Integers)如何保存类似[[Ljava.lang.Object;@3e25a5, [Ljava.lang.Object;@19821f]的数据? - 为什么 Java 允许用户将数据从原始数据列表添加到通用列表。在我的代码中,如果我将
Object[] ob1 = {1, 2, "3", "abc"};设为intList,则可以将其添加到intList.addAll(objList);,这是允许的并且可以顺利运行。
【问题讨论】:
-
袋熊有点兴奋,但你的问题确实是重复的,看看@JBNizet 链接了什么。
-
@tevemadar JBNizet 的链接有助于澄清我对例外情况的担忧,但我的第二个问题呢?
-
您使用了原始类型,因此允许将任何类型的对象添加到列表中。您将对象数组添加到该列表中。因此,在打印时,它会打印每个对象数组。并且数组的 toString() 方法返回数组的类型(此处为
[L),后跟其哈希码(3e25a5)。 -
ArrayList等通用对象在运行时不能/不能对其元素执行类型检查。泛型只能防止编译时错误。通过使用原始类型,您可以绕过编译时检查。这就是我们不使用原始类型的原因。另见例如docs.oracle.com/javase/tutorial/java/generics/erasure.html 和 stackoverflow.com/q/339699/2891664。您还可以查看ArrayList的代码,并注意它在内部使用了Object[]数组。
标签: java list data-conversion