【发布时间】:2011-04-02 11:13:32
【问题描述】:
我非常了解如何使用 C++-Templates —— 请注意,我不是专家。对于 Java 泛型(就此而言,还有 Scala),我遇到了困难。也许是因为我试图将我的 C++ 知识转化为 Java 世界。我在其他地方读到,“它们完全不同:Java 泛型只是语法糖节省演员,C++ 模板只是一个美化的预处理器”:-)
我很确定,两者都是一个有点简化的视图。因此,为了了解大和细微的区别,我尝试从 专业化 开始:
在 C++ 中,我可以设计一个 Template(函数类),它作用于 any 类型 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++ 中,我可以选择 specialize 处理没有 add() 的类型:
template<>
T plus<MyX>(MyX a, MyX b) { return a + b; }
即使所有其他类型仍然可以使用“默认”实现,现在我为MyX添加了一个特殊的实现——没有运行时开销。
是否有任何具有相同目的的 Java 泛型 机制?当然,在编程中一切都是可行的,但我的意思是在概念上,没有任何技巧和魔法?
【问题讨论】:
标签: java c++ generics template-specialization