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

4
我正在尝试创建一个矩阵库(教育目的),但遇到了一个难题,我不确定如何优雅地解决。添加两个矩阵是一项简单的任务,只需在每个矩阵的元素上使用方法get()即可。
然而,我使用的语法是错误的。NetBeans声称它期望一个类,但找到了一个类型参数; 对我来说,类型参数只是一个具有1:1映射到类集的集合。
我在这里错在哪里?我以前从未见过类型参数除了类之外的任何东西,因此以下代码段不应该意味着M是一个类吗? M extends Matrix
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类具有一个扩展自身的类型? - OneCricketeer
@cricket_007 我的理由是plus()函数应该返回一个类扩展自Matrix的对象。现在我打出来觉得真傻。也许返回类型只应该是Matrix。但是在plus()函数内部我无法实例化一个矩阵,对吧?因为它是一个抽象类。 - B. Lee
2
你不能直接实例化类型参数 M,因为你不知道它的确切类型。 - Andrew Tobilko
正确,您无法实例化抽象类,但您也无法直接实例化类型。您计划返回除 T 类型之外的矩阵吗? - OneCricketeer
1
我建议考虑创建 public abstract <M extends Matrix> M plus(M other); 并在子类中实现它。 - Andrew Tobilko
我认为@AndrewTobilko提供了迄今为止最好的解决方案。我本来希望避免这种方式,因为这意味着我必须在所有矩阵实现中创建此方法,即使它们是相同的,除了返回的矩阵类型不同。在plus()中没有使用Matrix抽象类类型之外的任何方法。 - B. Lee
4个回答

2

由于您不知道类型参数 M 的确切类型,因此无法直接实例化它。


我建议考虑创建以下方法

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

以及它在子类中的实现。


2

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

改为

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

在每个子类中,添加 plus 方法的实现。因为子类的构造函数是在那里定义的。


0
以下代码是错误的:
 M result = new M(2, 2);

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

基本上,你需要稍微改变一下你的数据结构,因为你的Matrix类是abstract的,也无法实例化!

我建议你将plus的返回类型更改为Matrix并将其保留为抽象的。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接