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)
?