【发布时间】:2023-03-24 07:10:01
【问题描述】:
我了解 C++ 中的模板与 Java 和 C# 中的泛型不同的方面。 C# 是一种具体化,Java 使用类型擦除,C++ 使用鸭子类型,等等。C++ 模板可以做许多 Java 和 C# 泛型不能做的事情(例如模板特化)。但是Java 泛型可以做很多 C# 和 C++ 不能做的事情(例如,为像 很多事情 C# 泛型可以做到 Java 和 C++ 做不到的(例如运行时通用反射)。 [编辑:显然 Java 泛型比我想象的要弱得多。 (这是在说些什么。)无论如何,尽管它们无能,但它们仍然与 C# 的泛型一起被视为泛型。]class Foo<T extends Comparable<?>> 这样的泛型系列创建有界类型参数),以及
我不明白是什么在概念上使模板与泛型不同。 C++ 模板的哪些部分是不能在不是模板但是泛型的东西中完成的事情?例如,如果我要实现一种支持模板的语言,那么其中绝对需要什么?对于支持泛型的语言,我可以省略什么?
我的猜测是模板是泛型的超集,或者它们是实现泛型的一种方式,但我不太明白真正的模板与真正的泛型的区别。
【问题讨论】:
-
泛型和模板都允许相同的源代码用于不同的类型。主要区别在于源代码编译成什么。简而言之:泛型 = 所有 类型(满足约束)的相同字节码;模板 = 实际使用的 每个 类型的不同机器代码。
-
所以泛型和模板是解决同一个问题的两种方法(使用不同类型的相同源代码),但没有一个是另一个的超集。对于泛型,C# 和 Java 再次遵循不同的方法,C# 具有对泛型的运行时支持,而 Java 没有。
-
你有一个事实不准确。 Java 中的有界类型参数近似于 C# 中的泛型类型约束。
-
@spender Java 所独有的并不是有界参数本身。 Java 允许您将它们与通配符结合使用,但 C# 没有通配符。通配符允许您指定一系列泛型。我在 C# 中的 Java 示例必须是
class Foo<T, U> where T : Comparable<U>。 -
@dtb C# 为值类型的实例化生成单独的字节码。例如。 List
和 List
标签: c# java c++ templates generics