有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

实例化子类对象的java抽象类方法?

我试图创建一个矩阵库(用于教育目的),但遇到了一个障碍,我不知道如何使用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) 个答案

  1. # 1 楼答案

    我认为你的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);
    }
    
  2. # 2 楼答案

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


    我建议考虑创建以下方法

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

    以及它在子类中的实现

  3. # 3 楼答案

    以下代码是错误的:

     M result = new M(2, 2);
    

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

    基本上,你需要稍微改变一下你的数据结构,因为你的Matrix类是abstract,而且也不能被实例化

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

  4. # 4 楼答案

    根据你的代码,我猜你想从矩阵中扩展一些子类,并对它们进行计算

    换成

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

    在每个子类中,添加plus的实现。因为这里定义了子类的构造函数