在java中,如何确定构造函数中变量的类型?

在java中,如何确定构造函数中变量的类型?,java,types,scope,Java,Types,Scope,我已经用Java创建了一个Matrix类,它同时适用于int和float。为此,我发现如果能够根据用户传递给构造函数的参数将变量mat声明为int或float,对我来说将非常方便 我目前的做法是: package Matrix; public class Matrix { int row,col,mat[][]; float fmat[][]; boolean real=false; public Matrix(int r,int c) {

我已经用Java创建了一个Matrix类,它同时适用于int和float。为此,我发现如果能够根据用户传递给构造函数的参数将变量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类的方法无法处理这些类型。如果有解决办法,请告诉我。也欢迎任何替代解决方案。谢谢。

为什么不使用通用? 比如:
矩阵,并将mat声明为:T[][]mat

正如其他用户所指出的,我也建议您将抽象重构为一个通用抽象,使用一个表示所包含元素类型的数字参数:

public class Matrix<T extends Number>
{
    private int rows;
    private int cols;
    private T[][] elements;

    public T determinant()
    {
        ...
    }
}

正如@addigo所建议的那样,您可以使用泛型来实现这一点。如果您的应用程序有性能要求,我个人建议您不要这样做,要么做您正在做的事情,要么编写两个单独的类。您可能不会因为使用泛型而受到性能的影响,但我的出发点是,编译器不会通过可能产生的自动取消装箱(或者如果您这样做,则显式取消装箱)很好地优化计算

要详细说明,如果使用泛型,最直接的方法是声明:

 public class Matrix<T extends Number> {
    private T[][] mat;

    // Rest of class
 }
公共类矩阵{
私人T[][]垫;
//其他同学
}
这本身并不坏。但接下来,作为一个简单的示例,您将看到类似于“add”方法的内容。看起来是这样的

 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);
  }
公共矩阵添加(矩阵m){
//检查矩阵尺寸的一致性
T[][]和=新的双精度[getRowDim()][getColDim()];
对于(int i=0;i
我在这里对其他方法做了一些假设,我没有明确定义,但其含义应该是显而易见的。(为了清晰和简洁,我还跳过了其他一些优化。)

如果您希望(例如)将
Matrix
类型的对象与
Matrix
类型的对象一起添加,那么在正确处理这种情况时也会遇到一些问题。这些并不是不可克服的,但我认为它们将开始挫败您从使用泛型中获得的好处


当然,这只是我的意见。如果你不关心速度,也不相信编译器足够好,可以消除这个问题,那么泛型仍然是一个不错的选择。

听起来像是
Matrix
应该是泛型的。就像@djechlin说的:使用泛型,你可以在这里找到一个教程:@Marged我仍然使用这个,因为我不知道如何在Java中添加和乘法泛型(即强制它们是整数或浮点),我不知道如何根据函数参数int或float来对代码进行不同的路由。因为您已经花了时间来表达一个答案:为什么不给他一个基于原始代码的示例?这对您的主要观点来说不是很重要,但是整型矩阵的行列式仍然是双精度的,但这是任何通常意义上的词。你是对的,但我已经将我的示例改编为OP,其中行列式返回一个
int
。无论如何,这是一个设计决策。
 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);
  }