Java 有没有办法指定抽象类中方法的返回值应与包含类的类型相同?

Java 有没有办法指定抽象类中方法的返回值应与包含类的类型相同?,java,inheritance,Java,Inheritance,假设我正在编写一些类来执行简单的数学运算,并且我有一个抽象类JNumber,其中包含一个用于添加另一个数字的方法: public abstract class JNumber { public abstract JNumber add(JNumber addend); // etc. } add的返回值表示此与参数加数的总和 现在假设我有一个JNumber的抽象子类(称为JFieldElement),它包含一个除法(例如,我不能在JNumber类中使用这个方法,因为你不能除法整数)

假设我正在编写一些类来执行简单的数学运算,并且我有一个抽象类
JNumber
,其中包含一个用于添加另一个数字的方法:

public abstract class JNumber
{
  public abstract JNumber add(JNumber addend);

  // etc.
}
add
的返回值表示
与参数
加数
的总和

现在假设我有一个
JNumber
的抽象子类(称为
JFieldElement
),它包含一个除法(例如,我不能在
JNumber
类中使用这个方法,因为你不能除法整数)

现在假设我正在编写一个过程,该过程将以某个类的实例x、y、z为例扩展
JFieldElement
,并计算一个表达式,如下所示:

x/(y+z)

我可以试试:

JNumber w = y.add(z);
JNumber result = x.div(w);
但是,如果这样做,我会得到一个错误-因为
add
的返回类型是
JNumber
,我们必须将
w
声明为
JNumber
。但是我们不能对它应用函数
div
,因为该函数需要接受
JFieldElement

如果有某种方法可以指定
add
函数总是返回一个与调用它的类类型相同的值,那么这种方法就行了。有办法吗?

publictadd(T加数);
public <T extends JNumber> T add(T addend);
公共T加(T加数);

我认为泛型应该做到这一点:

public abstract class JNumber<N extends JNumber<N>>
{
  public abstract N add(N addend);
  // etc.
}
公共抽象类JNumber
{
公开摘要N加(N加);
//等等。
}

我认为泛型应该做到这一点:

public abstract class JNumber<N extends JNumber<N>>
{
  public abstract N add(N addend);
  // etc.
}
公共抽象类JNumber
{
公开摘要N加(N加);
//等等。
}

您说过
JFieldElement
JNumber
的子类。我看不出来。你写了“…因为你不能除整数”。事实上你可以。10除以3等于3,1等于提醒。您说过
JFieldElement
JNumber
的子类。我看不出来。你写了“…因为你不能除整数”。事实上你可以。10除以3是3,1是提醒。谢谢-我本来希望不用泛型,但这看起来相当干净。你能解释一下为什么这样做吗;我已经盯着它看了一段时间,但我仍然不确定
JNumber
中发生了什么。如何将其子类化?是不是公共类JFieldElement扩展了JNumber??是的,这是对该构造进行子类化的方法。我同意这种表示法可能令人困惑(它看起来像递归)。你大概是在说:我声明了一个类型JNumber,它的子类可以在体内使用。我不确定这是否有意义,对不起,好的。我还需要在子类中以某种方式使用泛型吗?这取决于您想要什么。以与公共抽象类JFieldElement扩展JNumber相同的方式泛化JFieldElement可能是一个好主意,但这取决于您的需求。但是,为了实现您所要求的,没有必要这样做。谢谢-我希望在没有泛型的情况下实现它,但是这看起来相当干净。你能解释一下为什么这样做吗;我已经盯着它看了一段时间,但我仍然不确定
JNumber
中发生了什么。如何将其子类化?是不是公共类JFieldElement扩展了JNumber??是的,这是对该构造进行子类化的方法。我同意这种表示法可能令人困惑(它看起来像递归)。你大概是在说:我声明了一个类型JNumber,它的子类可以在体内使用。我不确定这是否有意义,对不起,好的。我还需要在子类中以某种方式使用泛型吗?这取决于您想要什么。以与公共抽象类JFieldElement扩展JNumber相同的方式泛化JFieldElement可能是一个好主意,但这取决于您的需求。然而,为了实现您所要求的,没有必要这样做。这是更好的答案,但它很便宜。详细解释一下为什么会这样?请解释一下重写这个方法的语法好吗?我是否编写
公共JFieldElement add(JFieldElement addend)
?这是更好的答案,但它很便宜。详细解释一下为什么会这样?请解释一下重写这个方法的语法好吗?我是否编写
公共JFieldElement add(JFieldElement addend)