我在Java中创建了一个适用于int和float的Matrix类。为此,我发现如果我能够将变量mat声明为int或float,这将取决于用户传递给构造函数的参数,这对我来说非常方便。
我目前的做法是:
package Matrix;
public class Matrix
{
int row,col,mat[][];
float fmat[][];
boolean real=false;
public Matrix(int r,int c)
{
row=r;
col=c;
mat=new int[r][c];
}
public int determinant()
{
//Code to calculate and return Determinant of mat
}
}
我只是想摆脱fmat和mat应该可以访问其他方法,如行列式。我知道我可以在浮点类型数组中存储int和float,但由于某些原因我不想要这个。我也可以将类型设置为Number或Object,但Integer或Float类的方法不适用于那些。如果有解决方案,请告诉我。任何替代解决方案也受到欢迎。感谢。
答案 0 :(得分:2)
正如其他用户所指出的那样,我也建议您将抽象重构为 generic ,并使用一个数字参数来表示所包含元素的类型:
public class Matrix<T extends Number>
{
private int rows;
private int cols;
private T[][] elements;
public T determinant()
{
...
}
}
通过此表单,编译器将确保代替参数T
的任何类型集都将成为Number
的子类。您可以在Matrix的定义中使用参数化类型T
。
实施课程后,您可以这样使用:
Matrix<Integer> matrixOfIntegers=new Matrix<Integer>(10, 20);
int determinant1=matrixOfIntegers.determinant();
Matrix<Double> matrixOfDoubles=new Matrix<Double>(10, 20);
double determinant2=matrixOfDoubles.determinant();
答案 1 :(得分:1)
根据@addigo的建议,您可以使用泛型来完成此任务。如果您的应用程序有性能要求,我个人建议不要这样做,要么做你正在做的事情,要么写两个单独的类。可能是你不会因使用泛型而受到性能损失,但我的起始位置是担心编译器不会通过可能导致的自动拆箱(或者如果你这样做)很好地优化计算,显式拆箱)。
详细说明,如果你使用泛型,最直接的方法就是声明:
public class Matrix<T extends Number> {
private T[][] mat;
// Rest of class
}
这本身并不坏。但是,那么你将会得到类似于&#34;添加&#34;方法作为一个简单的例子。这看起来像这样
public Matrix<T> add(Matrix<T> m) {
// Check for consistency of matrix dimensions
T[][] sum = new double[getRowDim()][getColDim()];
for(int i = 0; i < getRowDim(); ++i) {
for(int j = 0; j < getColDim(); ++j) {
sum[i][j] = mat[i][j] + m.mat[i][j]; // Auto unboxing happens here
}
}
return new Matrix(sum);
}
我已经对其他方法做了一些假设,我没有明确定义,但其含义应该是显而易见的。 (为了清晰和简洁,我还跳过了其他一些优化。)
您还有一些问题可以正确处理您希望添加Matrix<Float>
类型的对象与Matrix<Integer>
类型的对象的情况。这些并非不可克服,但我认为它们将首先打败你从使用仿制药中获得的好处。
当然,只是我的意见。如果你不关心速度或你对编译器足以消除这个问题的信心,那么泛型仍然是一个不错的选择。
答案 2 :(得分:0)
为什么不使用Generic? 喜欢: 矩阵,并将mat声明为:T [] [] mat