提问人:João Manuel Rodrigues 提问时间:4/3/2021 更新时间:4/3/2021 访问量:207
为什么 Java Boolean 实现 Comparable?[已结束]
Why does Java Boolean implement Comparable? [closed]
问:
在 Java 中,运算符 、 和 不是为基元类型定义的。
但是,相应的包装类实现 .
也就是说:是一个错误,但没问题。<
>
>=
<=
boolean
Boolean
Comparable
true > false
Boolean.TRUE.compareTo(Boolean.FALSE) > 0
怎么会这样? 语言设计师改变主意了吗? 那么,为什么要保持不连贯的行为呢?
虽然是任意的,但我可以想到为布尔值定义总顺序的好处。 有什么缺点吗?
答:
2赞
jurez
4/3/2021
#1
编程语言不是数学结构。它们是跨越多年的复杂项目,涉及许多不同的人。因此,他们受到意见、遗产、分歧、炒作周期、其他语言的影响、沟通不畅的影响,不幸的是,有时也会受到错误和愚蠢的影响。你可能会争辩说,关于一种语言的大多数决定实际上是任意的。
你的问题是完全有效的:为什么会这样?不幸的是,如果不询问做出相关承诺的人,他们还能记住多少,这并不是一个可行的选择。所以你的猜测和其他人的一样好。
它就是这样,但你有权有自己的意见。可悲的是,在某些情况下,这种不一致可能会令人沮丧,以至于人们放弃一种语言并创造一种新语言。但是,由于计算机是物理的、有限的东西,任何新语言也会是不完美和固执己见的。
如果你问我,有一个完整的订购是一个好主意 - 它不会伤害任何人,而在某些(尽管非常狭窄)的情况下,它可以提供一些有限的好处。但是 Java 还有很多、更大的问题。就目前而言,我不认为甲骨文会因为改变这种行为而破坏任何现有程序。boolean
评论
0赞
nicomp
4/3/2021
“编程语言不是数学结构。” - 是的,它们是。
2赞
jurez
4/3/2021
@nicomp:当然是,但是在无意义的硬件位的层面上,而不是我们希望它们成为的抽象层面上。我们所做的任何抽象都是泄漏的——也就是说,它们有一个被破坏的点。我知道,因为我试过了,但如果你不相信,请随时自己尝试。
0赞
VLAZ
4/5/2021
@nicomp 不,它们可以简化为数学结构。但最初的工作本质上并不完全是数学的。为什么 X 是这样规范的?好吧,因为爱丽丝在一个下午就完成了,没有人会费心去提炼它。为什么 Y 会以一种方式而不是另一种方式行事?鲍勃非常固执己见,这个会议进行得太久了,人们只是同意了,所以他们可以去喝杯咖啡。这些本质上都不是数学的。它们发生的频率比你想象的要高得多。
0赞
jurez
4/5/2021
为了澄清我的观点 - 我认为主要原因是计算机的空间和速度有限。例如,在数学中 (sqrt(2))^2 正好是 2,而在软件中,无论您使用多少个小数,总会出现舍入错误。每个抽象都会在某个地方中断,而达到这一点非常简单(即只需获取正常数据量的 1000000 倍)。在软件工程中,我们总是被迫偷工减料,所以这一切都是关于权衡的。正是这些权衡破坏了数学结构,或者准确地说,使它们过于复杂而无法使用。
评论
>
>
boolean
Boolean
false < true
A <= B