当我运行我的代码时,我收到以下错误:
Caused by: java.lang.ClassCastException: java.util.Collections$UnmodifiableSet cannot be cast to [Ljava.lang.Integer;
导致的代码是:
Integer[] selects = (Integer[]) tbl_analytes.getValue();
但是当我这样做时:
Object obj = tbl_analytes.getValue();
System.out.println(obj);
我得到以下输出:
[1,7,15]
我不明白为什么我无法将其转换为Integer[]
。有什么提示吗?
答案 0 :(得分:1)
Collection
接口具有将Collection
转换为数组的方法:
Object[] toArray();
或
<T> T[] toArray(T[] a);
您不能只将一种类型的对象转换为不相关的类型并期望它能够正常工作。
打印Set产生的输出看起来像打印数组时得到的输出并不意味着什么。
答案 1 :(得分:1)
final ArrayList<Integer> integerList = new ArrayList<>();
final Integer[] integerArray = new Integer[integerList.size()];
integerList.toArray(integerArray);
答案 2 :(得分:1)
似乎&#39; tbl_analytes&#39;是一个集合,而不是一个数组。你不能施展它,你必须转换它:
Integer[] array = set.toArray(new Integer[0]);
答案 3 :(得分:0)
您必须使用Collection interface中定义的toArray(T a[])
- 方法,将空Integer[]
传递给该方法。此解决方案假定您的列表类型为List<Integer>
。否则,这将失败。
答案 4 :(得分:0)
Set<Integer> values = (Set<Integer>) tbl_analytes.getValue();
类强制转换异常给出了实际类型。所以使用那个或更好的泛化(List而不是ArrayList等)。
答案 5 :(得分:0)
在Java语言中,数组是原始的。集合不是。
由于集合是无序的,因此无法理解如何从哈希存储位置集中构建有序数组。
输出集合时,您正在该集合上调用toString方法。
所以:
当我打电话
Integer[] selects = (Integer[]) tbl_analytes.getValue();
我收到以下错误:
Caused by: java.lang.ClassCastException: java.util.Collections$UnmodifiableSet cannot be cast to [Ljava.lang.Integer;
但是当我这样做时:
Object obj = tbl_analytes.getValue();
System.out.println(obj);
我得到以下输出 [1,7,15]
原因是Integer[]
完全无法从Set<Integer>
进行广播,但是
toString
的输出来自:
java.util.Collections $ UnmodifiableSet 扩展了 java.util.AbstractCollection
https://docs.oracle.com/javase/10/docs/api/java/util/AbstractCollection.html#toString()
返回此集合的字符串表示形式。字符串表示形式包括一个集合元素的列表,这些元素按其迭代器返回的顺序排列,并括在方括号(“ []”)中。相邻元素由字符“,”(逗号和空格)分隔。元素通过String.valueOf(Object)转换为字符串。
这是您遇到例外的原因。此问题的解决方案在此堆栈溢出问题中得到解答: