2 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
很不好意思,Java的特性比C++少得多。Java不支持模板。只支持很少的類似于C++模板的語法來實(shí)現(xiàn)很有限的泛型編程。
Java對(duì)泛型編程的支持也是最近才加進(jìn)去的,而且支持的很不好。你就不用指望能像C++那樣用它了。
Java是一個(gè)非常純粹的OOP語言,它天生就是相對(duì)動(dòng)態(tài)的、后期的,編譯期處理的信息非常少,這和C++強(qiáng)靜態(tài)的特性是完全相反的。
Java的絕大部分類型信息都屬于RTTI,也就是在運(yùn)行時(shí)動(dòng)態(tài)獲取,不像C++是在編譯期由編譯器推導(dǎo)的,所以Java基本上不可能支持C++那樣靈活的模板。
Java的泛型也是,說白了只是個(gè)障眼法,用類似C++那樣的模板語法來包裝了其面向?qū)ο髣?dòng)態(tài)cast的本質(zhì)而已。
舉例說,java中的Vector<int>,你給里面保存int的時(shí)候,每一個(gè)int都是先被包裝成一個(gè)Integer對(duì)象然后塞進(jìn)去,取出來的時(shí)候是先取出Object對(duì)象,轉(zhuǎn)換成Integer對(duì)象,然后再?gòu)睦锩嫒〕鰅nt這個(gè)整數(shù),繞了很大一個(gè)彎子。
雖然從代碼上寫的和C++差不多都很簡(jiǎn)潔,但是實(shí)際的效率和C++差了n個(gè)數(shù)量級(jí)。這點(diǎn)上實(shí)在是比較惡心,C#都做得比它好,C#至少對(duì)于值類型還是會(huì)實(shí)例化代碼的。
Java天生就是一個(gè)鼓勵(lì)動(dòng)態(tài)化、運(yùn)行期化、OOP化的一個(gè)語言,所以它不適合使用C++中那些泛型編程的范式來設(shè)計(jì)程序。你如果能夠忍受Java的裝箱拆箱的巨大效率損失,你可以用OOP的方式來實(shí)現(xiàn)那種同一個(gè)函數(shù)服務(wù)多種類型的想法,但是的確很低效。
- 2 回答
- 0 關(guān)注
- 525 瀏覽
添加回答
舉報(bào)