抽象类方法 - 实例化子类对象?

时间:2016-03-30 20:22:24

标签: java generic-programming

我试图创建一个矩阵库(教育目的)并且遇到了障碍我不确定如何使用 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);
}

4 个答案:

答案 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是不必要的。

如果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);
}

答案 3 :(得分:0)

以下代码错误:

 M result = new M(2, 2);

M不是可以实例化的类。

基本上,您需要稍微更改一下数据结构,因为Matrix类是abstract并且无法实例化!

我建议您将plus的返回类型更改为Matrix并将其保留为摘要。