3 回答

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

TA貢獻1790條經(jīng)驗 獲得超9個贊
template<typename T>; 去掉分號
i=max(i1,i2,i3); 改成i=max<int>(i1, i2, i3)
d=max(d1,d2,d3); 改成max<double>
g=max(g1,g2,g3); 改成max<long>
添加回答
舉報