我目前正在开发一个小型系统,我将从 byte
读取某些值。大批。其中一种类型必须是数组。其他类型是原语和字符串。
我遇到的问题是尝试创建并填充数组。该数组是通过一个方法填充的,我们称之为 next()
。 next()
将返回非空 Object
- 这个对象不会是一个数组。长度也是动态的,并且是从另一个源加载的,但对于以下代码,仅提供它。
final Integer[][] array = readArray(Integer[][].class, 10);
//...
// T = Integer[][]
// S = Integer[]
public static <T, S> S[] readArray(final Class<T> cls, final int length) {
if (cls.isArray()) {
final Class<S> subCls = (Class<S>) cls.getComponentType();
final S[] array = (S[]) Array.newInstance(subCls, length);
for (int i = 0; i < length; i++) {
if (subCls.isArray()) {
array[i] = readArray(subCls, length);
} else {
array[i] = (S) next();
}
}
return array;
}
throw new IllegalArgumentException("Type of cls must be an array.");
}
到目前为止,我已经有了这个。目前的问题在于该行:
array[i] = readArray(subCls, length);
错误是:
Error:(28, 41) java: incompatible types: no instance(s) of type variable(s) T,S exist so that S[] conforms to S
我已经尝试了很多方法来解决这个问题。包括使用 HelperArray<T, S>
类,但即使这样也不起作用。
我还想指出,数组的类型可能无法保证。唯一真正的保证是数组的顶级组件类型要么是字符串,要么是基元。例如,以下情况很可能发生:
Object[][]{String[]{}, Integer[]{}, byte[]{}}
非常感谢有关此问题的任何帮助,谢谢。
最佳答案
我把这个拼凑起来,对你有帮助吗?
对我来说,输出是一个全为 10x10 的 2D 数组。
public class Test {
public static void main(String[] args) {
Integer[][] array = readArray(Integer[][].class, 10);
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++)
System.out.print(array[i][j] + ",");
System.out.println();
}
}
// T = Integer[][]
// S = Integer[]
public static <T, S> S[] readArray(final Class<T> cls, final int length) {
if (cls.isArray()) {
final Class<S> subCls = (Class<S>) cls.getComponentType();
final S[] array = (S[]) Array.newInstance(subCls, length);
for (int i = 0; i < length; i++) {
if (subCls.isArray()) {
array[i] = (S) readArray((Class<?>) subCls, length);
} else {
array[i] = (S) next();
}
}
return array;
}
throw new IllegalArgumentException("Type of cls must be an array.");
}
private static Object next() {
// TODO Auto-generated method stub
return 1;
}
}
关于java - 创建 T 类型的 N 维数组并填充它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25818128/