Java 弱类型、自动装箱和扩大转换之间有什么区别?
弱类型(不要与动态类型混淆)的定义似乎是,当两个值都是不同类型时,二进制运算符可以工作 Python程序员认为Python是强类型的,因为Java 弱类型、自动装箱和扩大转换之间有什么区别?,java,php,javascript,python,weak-typing,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+“hello”
将失败,而不是静默地执行其他操作。相比之下,通常被认为是弱类型的其他语言(例如PHP、JavaScript、Perl)将默默地转换一个或两个操作数。例如,在JavaScript中,1+“hello”
->“1hello”
,而在Perl中,1+“hello”
->1
,但1+“5”
->6
现在,我的印象是Java被认为是一种强类型语言,但是自动(非)装箱和扩展转换似乎与此相矛盾。例如,
1+新整数(1)
->2
,hello+“1”
->“hello1”
,'A'+1
->66
,long可以自动转换为float,即使它通常被截断。Java是弱类型的吗?弱类型化、自动装箱和扩展转换之间有什么区别?弱类型化是指在编译器/解释器认为需要时隐式执行某些转换和特殊多态性
自动装箱是指在需要时将文字和非对象类型自动转换为各自的对象类型。(例如,Java将允许您像调用字符串对象一样对字符串文本调用方法。)这与键入系统无关。避免显式地创建对象实际上只是语法上的甜点
扩大转换是弱类型的一种形式。在非常严格的强类型语言中,这是不允许的。但是在像Java这样的语言中,它是允许的,因为它没有负面的副作用。有些小到现在还不足以再把java看作是强类型语言。
Java还为字符串连接重载+运算符。这无疑是弱类型语言中的一个特性,但同样,这并没有什么大不了的,不能称之为Java弱类型语言。(尽管我认为这是一个非常愚蠢的想法。)弱类型是指在编译器/解释器认为需要时隐式执行某些转换和特殊多态性 自动装箱是指在需要时将文字和非对象类型自动转换为各自的对象类型。(例如,Java将允许您像调用字符串对象一样对字符串文本调用方法。)这与键入系统无关。避免显式地创建对象实际上只是语法上的甜点 扩大转换是弱类型的一种形式。在非常严格的强类型语言中,这是不允许的。但是在像Java这样的语言中,它是允许的,因为它没有负面的副作用。有些小到现在还不足以再把java看作是强类型语言。
Java还为字符串连接重载+运算符。这无疑是弱类型语言中的一个特性,但同样,这并没有什么大不了的,不能称之为Java弱类型语言。(尽管我认为这是一个非常愚蠢的想法。)你从哪里得到这个定义的?这对我来说似乎很奇怪。“强”和“弱”这两个词在我的经验中通常不是很有用,但我绝对不会像你现在这样使用它们。@JonSkeet,你如何定义它?你从哪里得到这个定义的?这对我来说似乎很奇怪。“强”和“弱”这两个词在我的经验中通常不是很有用,但我绝对不会像你在这里这样使用它们。@JonSkeet,你如何定义它?