不兼容的类型:int不能转换为布尔值
我对C为何允许它而Java不允许的兴趣。因此,我对语言的类型系统特别是其强项感兴趣。
您的问题分为两部分:
为什么Java不转换int
为boolean
?
归结为Java旨在尽可能地明确。它的类型系统非常静态,非常“在您面前”。在Java中,使用其他语言自动进行类型转换的事情并非如此。您也必须写int a=(int)0.5
。转换float
为int
会丢失信息;与转换int
成boolean
,因此容易出错。而且,他们将不得不指定很多组合。当然,这些事情似乎很明显,但它们的意图是要谨慎。
哦,与其他语言相比,Java 的规范非常精确,因为字节码不仅仅是内部实现细节。他们将必须精确地指定所有交互。巨大的事业。
为什么不if
接受其他类型boolean
呢?
if
完全可以定义为允许除以外的其他类型boolean
。它可能有一个定义,说明以下内容是等效的:
true
int != 0
String
与 .length>0
- 任何其他非
null
(而不是Boolean
带有value的false
)对象引用。
- 甚至:任何其他非对象引用,
null
并且其方法Object.check_if
(我是为此而发明的)返回true
。
他们没有;并没有真正的需要,他们想让它尽可能健壮,静态,透明,易于阅读等。没有隐式功能。此外,我敢肯定,实现必须非常复杂,我必须在所有可能的情况下测试每个值,因此性能可能也发挥了很小的作用(Java在当时的计算机上曾经很流行;记得在那里在最初的发行版中没有JIT编译器,至少在我当时使用的计算机上没有)。
更深层次的原因
一个更深层次的原因很可能是Java具有其原始类型的事实,因此其类型系统在对象和原始之间被撕裂。也许,如果他们避免了这些事情,事情将会以另一种方式发生。使用上一节中给出的规则,它们将必须明确定义每个单个基元的真实性(因为基元不共享超类,并且没有null
为基元定义良好的)。很快,这将变成一场噩梦。
外表
好吧,最后,也许这只是语言设计师的偏爱。每种语言似乎都以自己的方式旋转...
例如,Ruby没有原始类型。一切,实际上是一切,都是对象。他们很容易确保每个对象都有特定的方法。
Ruby确实会在您可以抛出的所有类型的对象上寻找真实性。有趣的是,它仍然没有boolean
类型(因为它没有基元),而且它没有Boolean
类两种。如果您询问值true
具有什么类(可轻松提供true.class
),则得到TrueClass
。该类实际上具有方法,即booleans(| & ^ ==
)的4个运算符。在这里,if
当且仅当其值为false
或nil
(null
Ruby的)时,才将其值视为false 。其他一切都是真的。所以,0
或者""
都是如此。
对于他们来说,创建一个Object#truthy?
可以在任何类上实现并返回个人真实性的方法将是微不足道的。例如,String#truthy?
对于非空字符串,可能已经实现为true或诸如此类。即使在大多数部门中Ruby是Java的对立面(使用mixin进行动态鸭子输入,重新打开类等等),他们也没有这样做。
对于习惯于$value <> 0 || length($value)>0 || defined($value)
真实性的Perl程序员来说,这可能令人惊讶。等等。
输入带有约定的SQL,无论null
在什么表达式内,表达式都会自动使其变为false。这样(null==null) = false
。在Ruby中,(nil==nil) = true
。快乐时光。