我正在阅读一些关于某些不同编程语言中模板之间差异的问题。我明白,主要感谢这个问题: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