填充数组并调用超级

时间:2018-03-06 19:52:14

标签: java

现在我有这个课程:

public final class MyClass<T> {

    public MyClass(Function<Number, Function<Number, T>> func, Number rows, Number cols) {
        final T[][] result = (T[][]) new Object[rows.intValue()][cols.intValue()];
        for (int row = 0; row < rows.intValue(); ++row) {
            for(int col = 0; col < cols.intValue(); ++col) {
                result[row][col] = func.apply(row).apply(col);
            }
        }
        super(result);
    }
}

但是对super()的调用必须是构造函数体中的第一个语句。是否可以更改方法的主体以使构造函数有效?

由于泛型,填充数组的静态方法不起作用。

private static Object[][] fillArray(Function<Number, Function<Number, Object>> func, Number rows, Number cols) {
    final Object[][] result = new Object[rows.intValue()][cols.intValue()];
    for (int row = 0; row < rows.intValue(); ++row) {
        for(int col = 0; col < cols.intValue(); ++col) {
            result[row][col] = func.apply(row).apply(col);
        }
    }
    return result;
}

super((T[][])fillArray(func, rows, cols)); - 错误的第一个参数类型。找到F<Number, F<Number, T>>,必填F<Number, F<Number, Object>>(F - 函数)。

2 个答案:

答案 0 :(得分:1)

只需将结果代码提取到自己的静态方法中:

public final class MyClass<T> {

    public MyClass(Function<Number, Function<Number, T>> func, Number rows, Number cols) {
        super(result(func, rows, cols));
    }

    private static <Z> Z[][] result(Function<Number, Function<Number, Z>> func, Number rows, Number cols) {
        final Z[][] result = (Z[][]) new Object[rows.intValue()][cols.intValue()];
        for (int row = 0; row < rows.intValue(); ++row) {
            for(int col = 0; col < cols.intValue(); ++col) {
                result[row][col] = func.apply(row).apply(col);
            }
        }
        return result;
    }

}

请注意,静态方法本身就是一种通用方法。为了清楚起见,我使用了另一个类型变量(Z)。

答案 1 :(得分:1)

您拥有的代码似乎是自包含的,而您使用static的问题可能与未声明正确的泛型类型有关。你可以试试这个:

public final class MyClass<T> {

    private static <R> R[][] transform(Function<Number, Function<Number, R>> func, Number rows, Number cols) {
        final R[][] result = (R[][]) new Object[rows.intValue()][cols.intValue()];
        for (int row = 0; row < rows.intValue(); ++row) {
            for(int col = 0; col < cols.intValue(); ++col) {
                result[row][col] = func.apply(row).apply(col);
            }
        }
    }

    public MyClass(Function<Number, Function<Number, T>> func, Number rows, Number cols) {
        super(transform(func, rows, cols));
    }
}

<R>static方法范围内声明通用类型,与<T>上的MyClass<T>无关。如果您愿意,可以将方法上的<R>更改为您想要的任何内容,例如<T><E>,甚至<MyGenericType>,它仍然可以使用。