2016-03-30 51 views
4

我试图创建一个矩阵库(教育目的),并已达到障碍,我不知道如何处理宽限。添加两个矩阵是一项简单的任务,对每个矩阵的元素分别使用方法get()抽象类方法 - 实例化子类对象?

但是,我使用的语法是错误的。 NetBeans声称它期待一个类,但发现一个类型参数;对我而言,类型参数只是一组1:1映射到类的集合。

为什么我在这里错了?我从来没有见过类型参数比以前的任何类别都要多,所以下面的内容不应该暗示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); 
} 
+1

为什么Matrix类有一个扩展自己的类型? –

+0

@ cricket_007我的推理是函数plus()应该返回一个其类扩展Matrix的对象。现在我输入它真的很愚蠢。也许返回类型应该是Matrix ..但是我不能在plus()函数中实例化一个矩阵,对吧?因为它是一个抽象类。 –

+2

你不能直接实例化一个类型参数'M',因为你不知道它的确切类型。 – Andrew

回答

2

您不能直接实例化类型参数M,因为您不知道它的确切类型。


我建议考虑建立以下方法

public abstract <M extends Matrix> M plus(M other); 

及其在子类实现。

0

我不认为你的M是必要的。

如果MMatrix的子类,那么只需在您的定义中使用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); 
} 
0

下面的代码是错误的:

M result = new M(2, 2); 

M是不是可以实例化的类。

基本上,你需要改变你的数据结构,因为你的Matrix类是abstract并且不能被实例化!

我建议您将plus的退货类型更改为Matrix,并将其保留为抽象。

2

从你的代码中,我想你想从Matrix扩展一些子类并对它们进行计算。

更改为

public abstract class Matrix<T extends number> { 
    ... 
    public abstract Matrix plus(Matrix other); 
    ... 
} 

在每个子类中,添加执行加。因为子类的构造函数在那里定义。