关于java:弱打字,自动装箱,扩大转换有什么区别?

What is the difference between weak typing, autoboxing, widening conversions?

弱类型(不要与动态类型混淆)的定义是,当两个值都是不同的类型时,二元运算符可以工作。

python程序员认为python是强类型的,因为1+"hello"将失败,而不是默默地做其他事情。相反,其他通常被认为是弱类型的语言(例如php、javascript、perl)将静默地转换一个或两个操作数。例如,在javascript中,1+"hello"->"1hello",而在perl中,1+"hello"->1,但1+"5"->6

现在,我觉得Java被认为是一种强类型的语言,但是AUTO(UN)装箱和加宽转换似乎与此相矛盾。例如,1+new Integer(1)->2hello+"1"->"hello1"'A'+1->66,long可以自动转换成float,即使它通常被截断。Java是弱类型的吗?弱类型、自动氧化和加宽转换之间有什么区别?


弱类型是指如果编译器/解释器认为需要某些转换和特殊多态性,则隐式执行这些转换和特殊多态性。

自动修改是指文字和非对象类型在需要时自动转换为各自的对象类型。(例如,Java将允许您在字符串文本上调用方法,就像它是一个字符串对象)。这与打印系统无关。为了避免显式地创建对象,它实际上只是语法上的糖分。

加宽转换是弱类型的一种形式。在非常严格的强类型语言中,这是不允许的。但是在像Java这样的语言中,它是允许的,因为它没有负面的副作用。像这样小的东西很难再也不认为Java是一种强类型语言。

Java还为字符串连接重载+运算符。这绝对是在弱类型语言中看到的一个特性,但又不是一个足够大的调用Java弱类型的协议。(尽管我认为这是一个非常愚蠢的想法。)