为什么 Kotlin 的 Number-class 缺少运算符?

Why is Kotlin's Number-class missing operators?

在 Kotlin 中,Number 类型听起来很有用:一种在我需要数字时使用的类型。

然而,当实际使用它时,我很快发现它毫无用处:我不能对这些数字使用任何运算符。一旦我需要对它们做些什么,我就需要明确地转换它们(即使是为了比较)。

为什么语言设计者选择不在 Number 规范中包含运算符?

考虑到这一点,我注意到实施 Number.plus(n: Number): Number 可能很棘手,因为 n 可能与 this 的类型不同。
另一方面,我检查的所有 Number 子类型中的 such implementations do exist。当然,如果我想输入 1 + 1.2,它们是必需的,它会调用 Int.plus(d: Double): Double

我的结果是每次用一个号码都要打.toDouble()。这使得代码难以阅读(比较 a.toDouble() < b.toDouble()a < b)。

Number 中省略运算符是否有任何技术原因?

问题是 compareTo 方法的实现。虽然一开始添加它听起来很合理也很容易,但问题在于细节:

您如何比较任意 Number 类 的实例? Kotlin 可以使用 toDouble() 实现比较方法;但是 equality/precision 有问题:如何比较 BigDecimalDouble?在 BigDecimal 上使用 toDouble() 可能会失去精度,并且 two (actually different) BigDecimals might be considered equal using this method。 当您开始假设一种或两种类型由库提供时,情况会变得更糟,而您无法对精度等做出假设。

在Java中,Number type is not Comparable either。 此外,some Number values like NaN might not be comparable at all.

如果您需要 Number 进行比较,您可以轻松实现自己的 compareTo 方法作为扩展函数。但是,这有一些额外的限制,因为大多数 Number 子类型实现了 Comparable,并且扩展函数将失去该实现。

此答案归功于 Roland,我只是将他的评论(参见问题)扩展为答案。