假设我正在编写一些类来执行简单的数学运算,并且我有一个抽象类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
函数应始终返回与调用它的类相同类型的值,那么这将起作用。有没有办法做到这一点?
答案 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.
}