如何在java中的Constructors中确定变量的类型?

时间:2015-10-14 21:50:01

标签: java types scope

我在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类的方法不适用于那些。如果有解决方案,请告诉我。任何替代解决方案也受到欢迎。感谢。

3 个答案:

答案 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