2013-04-10 38 views
1

似乎弱类型的定义(不要与动态类型混淆)是当二者都是不同类型时,二元运算符可以工作。弱分类,自动装箱,扩大转换有什么区别?

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'+166,long可以自动转换为float,即使它通常会被截断。 Java弱类型?弱分类,自动装箱和扩大转换之间有什么区别?

+0

你从哪里得到这个定义?这对我来说似乎很奇怪。术语“强”和“弱”在我的经验中通常不是很有用,但我绝对不会像你在这里那样使用它们。 – 2013-04-10 20:25:57

+0

@JonSkeet,你会如何定义它? – Dog 2013-04-10 20:29:56

回答

3

如果编译器/解释器认为需要它,隐式执行某些转换和ad-hoc多态性时,弱分类就是这种情况。

自动装箱是当文字和非对象类型在需要时自动转换为它们各自的对象类型时。 (例如,Java将允许您像字符串对象那样调用字符串文字的方法)。这与键入系统无关。这真的只是语法糖,以避免显式创建对象。

加宽转换是一种弱类型。在非常严格的强类型语言中,这是不允许的。但是在像Java这样的语言中,它是允许的,因为它没有负面影响。像这样小的东西已经不足以让Java不再认为是强类型语言了。

Java也重载字符串连接的+运算符。这绝对是弱类型语言中的一个特征,但再次,对于调用Java弱类型来说这不是一个足够大的处理。 (尽管我认为这是一个非常愚蠢的想法。)

相关问题