为了看看我是否可以清理一些数学代码,主要是矩阵方面的东西,我尝试使用一些Java泛型。我有以下方法:
private <T> T[][] zeroMatrix(int row, int col) {
T[][] retVal = (T[][])new Object[row][col];
for(int i = row; i < row; i++) {
for(int j = col; j < col; j++) {
retVal[i][j] = 0;
}
}
return retVal;
}
让我头疼的是retVali =0这一行。这一行的目标是用T表示0来初始化数组。我尝试过用它做各种事情:(T在类中定义为T扩展Number)
retVal[i][j] = (T)0;
retVal[i][j] = new T(0);
唯一有效的方法是
retVal[i][j] = (T)new Object(0);
这不是我想要的。
这个是可能的吗?有没有一种更简单的方法来表示任何类型的数字(包括潜在的BigDecimal)的NxM矩阵,或者我卡住了?
发布于 2009-05-18 14:15:19
它应该是null而不是零。
如果你想为对象T放入等价的0,你需要提供一个T的工厂。类似这样:
interface Factory<T> {
T getZero();
}
你应该把这个方法写成这样:
private <T> T[][] zeroMatrix(int row, int col, Factory<T> factory) {
T[][] retVal = (T[][])new Object[row][col];
for(int i = row; i < row; i++) {
for(int j = col; j < col; j++) {
retVal[i][j] = factory.getZero();
}
}
return retVal;
}
您还应该为工厂提供适当的实现:
class IntegerFactory implements Factory<Integer> {
Integer getZero() {
return new Integer(0);
}
}
通常,您也会将getMatrix(int row, int column)
放在工厂实现中,以便实际返回正确的类型化数组。
发布于 2009-05-18 14:13:01
在Java中,该类型在运行时被擦除,因此您需要传入另一个参数来在运行时获取该类型。
它可以是初始化数组的值,也可以是要使用的类。
如果您选择传入类,那么使用一个类到值的映射来为每个类型存储一个零值。
然后,您可以使用java.util.Arrays.fill
填充数组:
private static HashMap<Class<?>, Object> ZEROS = new HashMap<Class<?>,Object>();
static {
ZEROS.put( Integer.class, Integer.valueOf(0) );
...
}
private static <T extends Number> T[][] zeroMatrix ( Class<T> type, int rows, int cols ) {
@SuppressWarnings("unchecked")
T[][] matrix = (T[][]) java.lang.reflect.Array.newInstance(type, rows, cols);
Object zero = ZEROS.get(type);
for ( T[] row : matrix )
java.util.Arrays.fill(row,zero);
return matrix;
}
Integer[][] matrix = zeroMatrix (Integer.class, 10, 10);
但是,如果性能是一个远程问题,您就不希望对数值代码使用盒装的值。
你真的不想尝试用null代替零-这会使你代码中所有其他路径的复杂度增加三倍。尽管您可以使用一个数字支持类来提供各种盒装数字类型的加法和乘法,但与提供两个或三个原始矩阵和几个大数字矩阵相比,您节省的复杂性将非常小,特别是如果您使用模板系统(例如ant的replace任务或XSLT)来生成源代码。
发布于 2009-05-18 14:11:01
Ye olde (引用)数组不能很好地处理泛型。在这种情况下,数组也可能是低效的。您正在创建数组的数组,因此存在不必要的间接和边界检查。最好是创建一个Matrix<T>
类。您可能还希望向Matrix
添加一个对表示零的T
实例的引用。
https://stackoverflow.com/questions/877897
复制相似问题