考虑以下示例:
abstract class Numeric {
abstract public Numeric add(Numeric other);
}
class Real extends Numeric {
private double inner;
public Real add(Real other) {
return this.inner + other.inner;
}
}
我能够专注于返回类型(毫无疑问是由于协方差),但编译器(可以理解)仍然会产生错误,因为我对
add
的实现仅用于 Real
不足以支持 Numeric
'更广泛的合同。
有没有一种方法可以在超类(例如Numeric
)中表达,实现者可以专门研究
this
以外的参数,而不使用泛型(因为它们对我的进行正交声明,除非您只考虑纯静态方法)?
我认为这是仿制药的工作:
public abstract class Numeric<N extends Numeric<N>> {
public abstract N add(N other);
}
我意识到通用语法很令人困惑。 我熟悉它的唯一原因是 java.lang.Enum 使用它。 这是完全有效、正常、正确的。
然后你可以像这样使用它:
public class Real
extends Numeric<Real> {
private double inner;
public Real(double value) {
this.inner = value;
}
@Override
public Real add(Real other) {
return new Real(this.inner + other.inner);
}
}