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

时间:2013-04-10 20:23:52

标签: java php javascript python weak-typing

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

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

现在,我的印象是Java被认为是强类型语言,但自动(联合)装箱和扩大转换似乎与此相矛盾。例如,1+new Integer(1) - > 2hello+"1" - > "hello1"'A'+1 - > 66,并且long可以自动转换为float,即使它通常被截断。 Java是否弱键入?弱打字,自动装箱和扩大转换之间的区别是什么?

1 个答案:

答案 0 :(得分:3)

弱分类是指如果编译器/解释器感觉需要某些转换和临时多态,则会隐式执行。

自动装箱是指在需要时文字和非对象类型自动转换为各自的对象类型的情况。 (例如,Java将允许您在字符串文字上调用方法,就像它是一个字符串对象一样。)这与键入系统无关。它实际上只是语法糖,以避免明确地创建对象。

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

Java还会重载+运算符以进行字符串连接。它绝对是在弱类型语言中看到的一个特性,但同样,也不是一个足够大的交易来称为弱类型的Java。 (尽管我认为这是一个非常愚蠢的想法。)