gpt4 book ai didi

Java从另一个数组的通用运行时类型创建数组

转载 作者:行者123 更新时间:2023-12-04 05:11:39 24 4
gpt4 key购买 nike

我有以下代码合并两个数组,并且应该处理除原语之外的任何类型。

@SuppressWarnings("unchecked")
public static synchronized <E> E[] aryMergeNoDup(E[]... arys){
HashSet<E> hs = new HashSet<E>();
for(E[] ary : arys) {
if(ary == null) continue;
for(E item : ary) {
if(item != null) hs.add(item);
}
}
hs.remove(null);
return hs.toArray((E[]) Array.newInstance(
arys.getClass().getComponentType(),hs.size()));
}

但是,当代码运行时,它会生成此异常:
java.lang.ArrayStoreException: java.lang.String
at java.util.AbstractCollection.toArray(AbstractCollection.java:188)
at util.Utils.aryMergeNoDup(Utils.java:197)

变量的运行时类型 arys是字符串[];但是,当我替换 arys.getClass().getComponentType() 时与 String.class代码运行良好。

但是,该方法只能用于字符串,因为 pf this.我看不出哪里出了问题,因为它们都应该引用 java.lang.String .

AbstractCollection.java:188 中引发异常的行是:
r[i] = (T)it.next();

public <T> T[] toArray(T[] a) {
// Estimate size of array; be prepared to see more or fewer elements
int size = size();
T[] r = a.length >= size ? a :
(T[])java.lang.reflect.Array
.newInstance(a.getClass().getComponentType(), size);
Iterator<E> it = iterator();

for (int i = 0; i < r.length; i++) {
if (! it.hasNext()) { // fewer elements than expected
if (a != r)
return Arrays.copyOf(r, i);
r[i] = null; // null-terminate
return r;
}
r[i] = (T)it.next();
}
return it.hasNext() ? finishToArray(r, it) : r;
}

最佳答案

由于是可变参数,运行时类型为arys将是 E[][] ,不是 E[] .因此你可能需要 arys.getClass().getComponentType().getComponentType()作为 Array.newInstance 的参数.

关于Java从另一个数组的通用运行时类型创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14859106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com