java - 有什么方法可以指定抽象类中方法的返回值应该与包含类具有相同的类型吗?

标签 java inheritance

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

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

  // etc.
}

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

现在假设我有一个 JNumber 的抽象子类(称为 JFieldElement),其中包含一个除法方法(我不能在 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 函数应始终返回与调用它的任何类相同类型的值,那么这将起作用。有办法做到这一点吗?

最佳答案

我认为泛型应该在这里发挥作用:

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

关于java - 有什么方法可以指定抽象类中方法的返回值应该与包含类具有相同的类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22539945/

相关文章:

oop - 使用子类中定义的静态方法进行排序

android - Android中Activity之间的继承

java - 如何检查我的代码中按钮的背景(在我设计的各种可绘制 xml 之间)以便我可以修改它?

java - Web服务输出多种格式

java SSLEngine 说 NEED_WRAP,调用 .wrap() 并且仍然是 NEED_WRAP

scala - 如何找到祖先类的类型参数?

java - 使用 printf 方法显示小数位

java - 在我实现 onSaveInstance 和 onRestoreInstance 后旋转屏幕后,textView 中的数据被删除

python - Python 继承的问题

c++ - 使用reinterpret_cast