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

Java 抽象类方法-实例化子类对象?,java,generic-programming,Java,Generic Programming,我试图创建一个矩阵库(教育目的),但遇到了一个障碍,我不知道如何优雅地处理。添加两个矩阵是一项简单的任务,分别对每个矩阵的元素使用方法get() 然而,我使用的语法是错误的。NetBeans声称它需要一个类,但找到了一个类型参数;对我来说,类型参数只是一个1:1映射到类集合的集合 为什么我错了?我以前从未见过类型参数不是类,所以下面的位不应该暗示M是类吗 M扩展矩阵 公共抽象类矩阵 { 私有int行,cols; 公共矩阵(整数行,整数列) { this.rows=行; this.cols=col

我试图创建一个矩阵库(教育目的),但遇到了一个障碍,我不知道如何优雅地处理。添加两个矩阵是一项简单的任务,分别对每个矩阵的元素使用方法get()

然而,我使用的语法是错误的。NetBeans声称它需要一个类,但找到了一个类型参数;对我来说,类型参数只是一个1:1映射到类集合的集合

为什么我错了?我以前从未见过类型参数不是类,所以下面的位不应该暗示M是类吗

M扩展矩阵

公共抽象类矩阵
{
私有int行,cols;
公共矩阵(整数行,整数列)
{
this.rows=行;
this.cols=cols;
}
公共M plus(矩阵其他)
{
//对隐式和显式参数使用get()进行一些数学运算。
//将结果存储在与隐式参数相同类型的新矩阵中,
//在新矩阵上使用set()。
M结果=新的M(2,2);/*示例*/
}
公共摘要T get(int行,int列);
公共抽象无效集(int行、int列、T值);
}

我认为你的
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);
}
公共抽象类矩阵
{
私有int行,cols;
公共矩阵(整数行,整数列)
{
this.rows=行;
this.cols=cols;
}
公共矩阵加(矩阵其他)
{
}
公共摘要T get(int行,int列);
公共抽象无效集(int行、int列、T值);
}

以下代码错误:

 M result = new M(2, 2);
M
不是可以实例化的类

基本上,您需要稍微更改一下数据结构,因为您的
矩阵
类是
抽象的
,也无法实例化


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

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



我建议考虑创建以下方法

public abstract <M extends Matrix> M plus(M other); 
公开摘要M加(M其他);

以及它在子类中的实现。

根据您的代码,我猜您希望从Matrix扩展一些子类,并对它们进行计算

改为

public abstract class Matrix<T extends number> {
  ...
  public abstract Matrix plus(Matrix other);
  ...
}
公共抽象类矩阵{
...
公开摘要矩阵加(矩阵其他);
...
}

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

为什么矩阵类有一个扩展自身的类型?@cricket\u 007我的推理是函数plus()应该返回一个类扩展矩阵的对象。现在我把它打印出来,听起来真的很傻。也许返回类型应该是矩阵。。但是我不能在plus()函数中实例化矩阵,对吗?因为它是一个抽象类。你不能直接实例化一个类型参数
M
,因为你不知道它的确切类型。没错,你不能实例化一个抽象类,但你也不能直接实例化一个类型。您是否计划返回T类型以外的矩阵?我建议考虑创建
公共抽象M plus(M other)
及其在子类中的实现
public abstract class Matrix<T extends number> {
  ...
  public abstract Matrix plus(Matrix other);
  ...
}