为什么 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 有问题:如何比较 BigDecimal
和 Double
?在 BigDecimal
上使用 toDouble()
可能会失去精度,并且 two (actually different) BigDecimal
s 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,我只是将他的评论(参见问题)扩展为答案。
在 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 有问题:如何比较 BigDecimal
和 Double
?在 BigDecimal
上使用 toDouble()
可能会失去精度,并且 two (actually different) BigDecimal
s 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,我只是将他的评论(参见问题)扩展为答案。