我知道相當多一點如何使用C++ - 模板 - 不是專家,介意你。與Java泛型(和斯卡拉,就此而言),我有我的diffuculties。也許,因爲我試圖將我的C++知識轉化爲Java世界。我在其他地方看過,「他們沒有什麼特別之處:Java泛型只是語法上的糖節省,C++模板只是一個榮耀的預處理器」:-)Java泛型,支持「專業化」?與C++模板的概念相似?
我很確定,兩者都有點簡化了。所以,瞭解大和細微的差別,我嘗試啓動專業化:
在C++我可以設計一個模板(類的功能),其作用於任何類型T
支持我所需的操作:
template<typename T>
T plus(T a, T b) { return a.add(b); }
現在這潛在地增加了plus()
操作的任何類型的可以add()
[注1] [1]
因此,如果T
支持add(T)
我的模板工作。如果沒有, 只要我不使用plus()
,編譯器就不會抱怨。在Python 我們稱之爲「鴨打字」:*如果它像鴨子,叫起來像鴨子, 它是鴨子,這是修改*(當然,使用type_traits了一下, 但只要我們沒有概念,這是如何C++模板工作,對嗎?)
我想,這是怎麼Java中的泛型工作,是不是?泛型類型I設備被用作「模板」,如何操作任何我嘗試在其中放置的東西,對吧?據我的理解,我可以(或必須)將約束放在類型參數上:如果我想在我的模板中使用add
,我必須聲明類型參數爲implement Addable
。正確?所以,沒有「鴨子打字」(好或壞)。現在
,在C++我可以選擇上一類專門有沒有add()
:
template<>
T plus<MyX>(MyX a, MyX b) { return a + b; }
即使所有其他類型仍然可以使用「默認」的實施,現在我添加了一個特殊的MyX
- 沒有運行時間開銷。
是否有任何Java泛型具有相同目的的機制?當然,在編程中一切都是可行的,但我的意思是在概念上,沒有任何技巧和魔法?
類型擦除方法應該是'可加總和(可加第一,可加第二)' – irreputable 2011-04-02 13:10:32
@irreputable:謝謝,你說得對。我改變了這一點。 – 2011-04-02 15:11:54
對於'sum'泛型如何工作的很好的解釋。現在我可以將它翻譯成我以前的Java知識。但是這裏擦除的是什麼? 「類型擦除」的名稱是指什麼? – towi 2011-04-03 14:11:43