2013-04-10 56 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弱類型來說這不是一個足夠大的處理。 (儘管我認爲這是一個非常愚蠢的想法。)

相關問題