我正在閱讀一些關於某些不同編程語言中模板之間差異的問題。我明白,主要感謝這個問題:What are the differences between Generics in C# and Java... and Templates in C++?。然而,當他開始談論接口和添加內容時,我對接受的答案的結尾有點困惑。我主要從這個問題了解接口的概要:Explaining Interfaces to Students。問題中所陳述的內容我仍然感到困惑。因此,有人可以更好地解釋這最後一部分:Java接口和模板混淆
正因爲如此,C++編譯器的地方您可以用模板做任何限制 - 基本上任何代碼,你可以手工編寫, 你可以得到的模板爲你寫。最明顯的例子是 添加的東西:
在C#和Java泛型系統需要知道有哪些方法可以 一類,它需要通過這個下到虛擬機 。要告訴它的唯一方法是通過硬編碼 實際類或使用接口。例如:
string addNames(T first,T second){return first.Name()+ second.Name(); }
該代碼不會在C#或Java中編譯,因爲它不知道 類型T實際上提供了名爲Name()的方法。你必須告訴 它 - 在C#中是這樣的:
interface IHasName {string Name(); }; string addNames(T first,T second)其中T:IHasName {....}
然後你必須確保你傳遞的東西addNames 實現IHasName接口等等。 java的語法是 different(),但它遭受相同的 問題。
「經典」的情況下對這個問題是試圖寫一個函數 ,其執行此
串addNames(T第一,T秒){第二返回第一+; }
你實際上不能編寫這段代碼,因爲沒有辦法用 聲明一個帶有+方法的接口。你失敗了。
C++患有這些問題。編譯器不關心 關於將類型傳遞給任何虛擬機 - 如果兩個對象都有 .Name()函數,它將進行編譯。如果他們不這樣做,它不會。簡單。
我真的很想理解這個答案中的代碼,因爲我很困惑如何.Name()方法在IHasName接口中工作。是否有人有一個更好的例子,可以進一步解釋如何使用接口可以添加類名稱到Person類或其他東西...
編輯:我更感興趣的Java代碼。
謝謝你的答案。我的問題不是代碼是否工作,而是更多地尋找代碼的解釋,因爲我相信這很好,但我不確定「如何」。看到像這樣的完整程序更好地解釋了這個例子,並且實際上回答了我的問題。謝謝! – LiverpoolFTW