为什么 Java Boolean 实现 Comparable?[已结束]

Why does Java Boolean implement Comparable? [closed]

提问人:João Manuel Rodrigues 提问时间:4/3/2021 更新时间:4/3/2021 访问量:207

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章来用事实和引文来回答。

2年前关闭。

在 Java 中,运算符 、 和 不是为基元类型定义的。 但是,相应的包装类实现 . 也就是说:是一个错误,但没问题。<>>=<=booleanBooleanComparabletrue > falseBoolean.TRUE.compareTo(Boolean.FALSE) > 0

怎么会这样? 语言设计师改变主意了吗? 那么,为什么要保持不连贯的行为呢?

虽然是任意的,但我可以想到为布尔值定义总顺序的好处。 有什么缺点吗?

Java 布尔代数

评论

0赞 Eugene 4/3/2021
是的,这就是他们选择实施它的方式。并不是说我认为编译原语有多大意义......>
0赞 João Manuel Rodrigues 4/3/2021
@Eugene,编译为原语将使其与 .那么,为什么不呢?在 Pascal 中,boolean 被定义为具有任意顺序的枚举类型。一种可能的用途:可用于表示“A 暗示 B”。(不是很直观,我知道,但我见过它这样用。>booleanBooleanfalse < trueA <= B
2赞 Joachim Sauer 4/3/2021
“为什么语言是这样设计的”,在我们从语言设计者那里得到答案之前,无法有一个客观可验证的答案。这可能只是演变成讨论和意见。因此,我投票决定以基于意见的方式结束。
2赞 Andy Thomas 4/3/2021
参见 为什么布尔包装器类实现 Serializable 接口和 Comparable 接口?它有什么用?.
1赞 Andy Thomas 4/3/2021
我找到了导致将 Comparable 添加为 Boolean 超接口的原始错误,并在对上述重复问题的回答中总结了基本原理。

答:

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 倍)。在软件工程中,我们总是被迫偷工减料,所以这一切都是关于权衡的。正是这些权衡破坏了数学结构,或者准确地说,使它们过于复杂而无法使用。