gpt4 book ai didi

math - ScalaNumber 的实现如何在底层工作?

转载 作者:行者123 更新时间:2023-12-01 09:31:32 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com