我知道如何使用C++ 模板——不是专家,请注意。使用Java 泛型(和 Scala,就此而言),我遇到了困难。也许是因为我试图将我的 C++ 知识转化为 Java 世界。我在其他地方读到,“它们完全不同:Java 泛型只是语法糖节省演员,C++ 模板只是一个美化的预处理器”:-)
我很确定,两者都是一个有点简化的视图。因此,为了了解大和细微的差异,我尝试从Specialization开始:
在C++中,我可以设计一个模板(函数类),它作用于支持我所需操作的任何类型T
:
template<typename T>
T plus(T a, T b) { return a.add(b); }
现在,这可能会将plus()
操作添加到任何可以add()
.[note1][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 泛型机制?当然,在编程中一切都是可行的,但我的意思是在概念上,没有任何技巧和魔法?