我试图创建一个矩阵库(教育目的)并且遇到了障碍我不确定如何使用 grace 。添加两个矩阵是一项简单的任务,在每个矩阵上使用 get()方法'单独的元素。
但是,我使用的语法是错误的。 NetBeans声称它期待一个类,但发现了一个类型参数;对我来说,类型参数只是一组与1到1的映射到类的集合。
为什么我错了?我之前从未见过类型参数不是一个类,所以不应该在下面的位中暗示M是一个类吗?
M扩展矩阵
public abstract class Matrix<T extends Number, M extends Matrix>
{
private int rows, cols;
public Matrix(int rows, int cols)
{
this.rows = rows;
this.cols = cols;
}
public M plus(Matrix other)
{
// Do some maths using get() on implicit and explicit arguments.
// Store result in a new matrix of the same type as the implicit argument,
// using set() on a new matrix.
M result = new M(2, 2); /* Example */
}
public abstract T get(int row, int col);
public abstract void set(int row, int col, T val);
}
答案 0 :(得分:2)
您无法直接实例化类型参数M
,因为您不知道其确切类型。
我建议考虑创建以下方法
public abstract <M extends Matrix> M plus(M other);
及其在子类中的实现。
答案 1 :(得分:2)
从你的代码中,我想你想从Matrix扩展一些子类并对它们进行计算。
更改为
public abstract class Matrix<T extends number> {
...
public abstract Matrix plus(Matrix other);
...
}
在每个子类中,添加plus的实现。由于子类的构造功能在那里被定义。
答案 2 :(得分:0)
我认为你的M
是不必要的。
如果M
是Matrix
的子类,那么只需在定义中使用Matrix
。
public abstract class Matrix<T extends Number>
{
private int rows, cols;
public Matrix(int rows, int cols)
{
this.rows = rows;
this.cols = cols;
}
public Matrix<T> plus(Matrix<T> other)
{
}
public abstract T get(int row, int col);
public abstract void set(int row, int col, T val);
}
答案 3 :(得分:0)
以下代码错误:
M result = new M(2, 2);
M
不是可以实例化的类。
基本上,您需要稍微更改一下数据结构,因为Matrix
类是abstract
并且无法实例化!
我建议您将plus
的返回类型更改为Matrix
并将其保留为摘要。