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

时间:2014-03-20 16:54:11

标签: java inheritance

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

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

  // etc.
}

add的返回值表示this与参数addend的总和。

现在假设我有一个JFieldElement的抽象子类(称为JNumber),其中包含一个划分方法(我不能在JNumber类中使用此方法,因为你可以'例如,除以整数。

public abstract class JFieldElement
  extends JNumber
{
  public abstract JFieldElement div(JFieldElement divisor);
}

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

x /(y + z)

我可能会尝试:

JNumber w = y.add(z);
JNumber result = x.div(w);

但是,如果这样做,那么我会收到错误 - 因为add的返回类型是JNumber,我们必须将w声明为JNumber。但是我们不能将函数div应用于它,因为该函数需要接受JFieldElement

如果有某种方式指定add函数应始终返回与调用它的类相同类型的值,那么这将起作用。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

public <T extends JNumber> T add(T addend);

答案 1 :(得分:3)

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

public abstract class JNumber<N extends JNumber<N>>
{
  public abstract N add(N addend);
  // etc.
}