java - 创建 T 类型的 N 维数组并填充它

标签 java arrays generics casting

我目前正在开发一个小型系统,我将从 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/

相关文章:

javascript - 根据对象中的键长度/计数对对象数组进行排序

Java:如何为抽象类的子类创建包装类来实例化包装类

swift - 可以在带有泛型的类内部使用快速泛型吗

Java 多线程 getter 和 setter

java - GWT 为我的所有 Web 应用程序启用 esc 键

从txt文件创建int数组,在C中数字之间有多行和空格

Java泛型编译器错误: What's wrong?

java - Amazon S3 AWS 上传进度监听器

java - 第一个 REST Spring 应用程序

c - strdup 将每一行放入 char ** (数组)