现在我有这个课程:
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 - 函数)。
答案 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>
,它仍然可以使用。