我知道相当多一点如何使用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