作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
scala.math.ScalaNumber
是一个 Java 文件,如下所示:
public abstract class ScalaNumber extends java.lang.Number {
protected abstract boolean isWhole();
public abstract Object underlying();
}
scala.math.BigDecimal
实现它:
class BigDecimal(val bigDecimal: BigDec, val mc: MathContext)
extends ScalaNumber with ScalaNumericConversions with Serializable {
...
def underlying = bigDecimal
}
以及scala.math.BigInt
:
class BigInt(val bigInteger: BigInteger) extends ScalaNumber with ScalaNumericConversions with Serializable {
...
def underlying = bigInteger
}
令人困惑的是,underlying
的类型是 java.math.BigDecimal
/java.math.BigInt
而不是 Object
.
我是否遗漏了一些非常明显的东西或者这里有什么特殊情况?
编辑:当然我错过了一些明显的东西......你没事。协变返回类型。谢谢!
最佳答案
它只是一个covariant return type ,这在 Scala 和 Java 中都是允许的。
其背后的基本原理是:如果一个类Base
promise 返回A
形成某个方法,然后是一个子类Derived <: Base
尊重 Liskov substitution principle如果它返回 A
或任何子类 B <: A
.当然,如果 BigInt#underlying
返回 BigInteger
,这对 ScalaNumber
的客户来说没有问题。 ,谁可能只希望平淡Object
.
关于math - ScalaNumber 的实现如何在底层工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6064054/
scala.math.ScalaNumber 是一个 Java 文件,如下所示: public abstract class ScalaNumber extends java.lang.Number
我是一名优秀的程序员,十分优秀!