0

我正在Matrix用 Java 创建一个类以在线性代数程序中使用。现在它拥有双打,但我想抽象它。

我创建了一个名为 的接口MatrixElement,它将包含addmultiplydivide以及执行这些矩阵运算所需的任何其他算术方法。

这是该Matrix课程的一个片段:

public class Matrix<T extends MatrixElement> {

    private ArrayList<ArrayList<T>> rows;

    public Matrix(int numRows, int numCols) {

        if (numRows <= 0) {
            throw new IllegalArgumentException("Matrix must have at least one row.");
        }

        if (numCols <= 0) {
            throw new IllegalArgumentException("Matrix must have at least one column.");
        }

        this.rows = new ArrayList<ArrayList<T>>();

        for (int r = 0; r < numRows; r++) {
            ArrayList<T> row = new ArrayList<T>();
            for (int c = 0; c < numCols; c++) {
                row.add(new T());
            }
            this.rows.add(row);
        }

    }

     /* lots of methods omitted */

     public static Matrix sum(Matrix a, Matrix b) {

        if (a.numRows() != b.numRows() || a.numCols() != b.numCols()) {
            throw new IllegalArgumentException("Matrices must be the same size.");
        }

        Matrix sum = new Matrix(a.numRows(), b.numCols());

        for (int r = 1; r <= b.numRows(); r++) {
            for (int c = 1; c <= b.numCols(); c++) {
                sum.setEntry(r, c, a.getEntry(r, c).add(b.getEntry(r, c)));
            }
        }

        return sum;

    }

    public Matrix add(Matrix matrix) {
        return Matrix.sum(this, matrix);
    }

}

以下是方法的声明方式MatrixElement

public interface MatrixElement {
    public MatrixElement add(MatrixElement e);
}

最后,这是我创建的实现此接口的示例类:

public class Fraction implements MatrixElement {

    private BigInteger numerator;
    private BigInteger denominator;

    public Fraction(int num, int denom) {
        numerator = BigInteger.valueOf(num);
        denominator = BigInteger.valueOf(denom);
    }

    @Override
    public Fraction add(MatrixElement e) {

        Fraction f;

        try {
            f = (Fraction) e;
        } catch (ClassCastException cce) {
            throw new IllegalMatrixOperationException("Cannot add " + this.getClass().toString() + " and " + e.getClass().toString());
        }

        /* addition code omitted */

        return this;

    }
}

这里的主要思想是:

  • Matrix对象可以包含任何一个实现该接口的类的实例MatrixElement
  • MatrixElement包含矩阵操作所需的算术方法,例如add
  • 踢球者:实现的类MatrixElement只能在同一类的其他实例上使用其方法。例如,Fraction只能添加到其他Fraction实例。两个类可以实现MatrixElement但它们不一定能够相互添加。

我由另一个程序员运行了这个设计,并被告知这样的铸造是不好的做法。如果是这样,这样做的正确方法是什么?如何使用接口对具有类似功能的类进行“分组”,以用于参数化,然后限制所述接口的哪些子级可以在子级方法中使用?

4

1 回答 1

0

上面的帖子中对泛型有两个要求。

要求1:可以添加到其他同类型元素的元素

您想对某些数据类型强加一个契约,以便这些类型的实例可以添加到相同类型的其他实例中,并且仅限于相同类型。目的是支持以下类型的操作:

int + int = int
long + long = long
real fraction + real fraction = real fraction
complex number + complex number = complex number

该合同可以表述如下:

public interface MatrixElement<T> {
  T add(T e);
}

用简单的语言来说,这个契约说 aMatrixElement是一个类型,它的实例可以添加到相同类型的其他实例中,以产生另一个相同类型的实例,这是需要的。

要求2:元素的二维矩阵,所有相同类型的元素都可以添加到其他相同类型和相同维度的元素的二维矩阵中

该合约可以表示为:

public class Matrix<T extends MatrixElement<T>> {
  public Matrix<T> add (Matrix<T> another) { ... }
}

该合同说 aMatrix由 type 的元素组成MatrixElement,因此所有元素都属于同一类型。Matrix还允许与 another 相加Matrix,前提是两者具有相同类型的元素。结果以Matrix具有相同类型元素的第三个形式返回。


Github 上有一个示例。

于 2017-05-15T06:13:05.963 回答