gpt4 book ai didi

Java Reflection(不确定如何表达,请查看内部以获取更多信息)

转载 作者:行者123 更新时间:2023-12-01 10:11:00 24 4
gpt4 key购买 nike

我需要制作二维数组的深层复制。我知道该怎么做

int[][] a = new int[original.length][];
for(int i = 0; i < original.length; i++) {
a[i] = Arrays.copyOf(original[i], original[i].length);
}

但是,我现在不知道我正在复制的数组的对象类型。我有一个这样的方法

public Object[] copy(Object[] original) {}

如果它是一个数组的数组,它应该返回原始的深拷贝。如果该方法被赋予 int[][],我无法将其转换为数组的对象(因为它是原始类型)。

目前,我可以检查“original”是否是一个像这样的二维数组

if(original==null||original.length==0||!original.getClass().getName().startsWith("[")) {
return null;
}

但现在我不确定如何对未知类型的数组进行深层复制。我假设我需要使用 Java Reflection,尽管我不是 100% 确定我将如何去做。

仅供引用,这是我最初的尝试

public Object[] copy(Object[] original) {
if(original==null||original.length==0||!original[0]getClass().getName().startsWith("[")) {
return null;
}
Object[][] returnArray = new Object[original.length][];
for(int i = 0; i < original.length; i++) {
returnArray[i] = Arrays.copyOf((Object[]) original[i], ((Object[]) original[i]).length);
}
return returnArray
}

不幸的是,int[] 无法转换为 Object[](或任何原语[])。

最佳答案

我可以想到一个带有基元开关的解决方案,就像数组为每个基元都有一个 copyOf 函数:

public static Object[] copyDeep(Object[] original) {
Object[] newArray = Arrays.copyOf(original, original.length);
if ( newArray.getClass().getComponentType().isArray()) {
for (int i = 0; i < newArray.length ; i++) {
switch (newArray[i].getClass().getComponentType().getSimpleName()) {

case "int" : newArray[i] = Arrays.copyOf( (int[])newArray[i],Array.getLength(newArray[i]));
break;

case "float" : newArray[i] = Arrays.copyOf( (float[])newArray[i],Array.getLength(newArray[i]));
break;
// TODO other primitives

default: newArray[i] = Arrays.copyOf( (Object[])newArray[i],Array.getLength(newArray[i]));
}
}
}
return newArray;
}

`

关于Java Reflection(不确定如何表达,请查看内部以获取更多信息),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36114445/

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