弱类型、自动装箱、扩展转换之间的区别是什么?


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被认为是一种强类型语言,但是自动(非)装箱和扩展转换似乎与此相矛盾。例如,1+new Integer(1) -> 2, hello+"1" -> "hello1", 'A'+1 -> 66和long可以自动转换为float,尽管它通常会被截断。Java是弱类型的吗?弱类型、自动装箱和扩展转换之间的区别是什么?

弱类型是指当编译器/解释器认为需要时隐式执行某些转换和特定多态性。

自动装箱是指文字和非对象类型在需要时自动转换为各自的对象类型。(例如,Java将允许您在字符串字面值上调用方法,就好像它是字符串对象一样。)这与打字系统无关。它实际上只是语法糖,以避免必须显式创建对象。

扩展转换是弱类型的一种形式。在非常严格的强类型语言中,这是不允许的。但是在像Java这样的语言中,它是允许的,因为它没有负面的副作用。这样的小问题不足以让我们不再认为Java是一种强类型语言。

Java还重载+操作符用于字符串连接。这绝对是弱类型语言中可以看到的一个特性,但是再次强调,还不足以将Java称为弱类型。(尽管我认为这是一个非常愚蠢的想法。)