我了解 C++ 模板,但不懂 Java。
谁能帮我解释一下吗?
请您参考如下方法:
它们实际上以非常不同的方式实现。在 C++ 中,模板在编译时专门化,而 .Net 泛型在运行时专门化。
换句话说,C++ 代码如 MyClass<A> a
使编译器执行模板参数替换并为该类生成二进制文件,就好像它在编译时是常规类一样。
这就是我的意思:
template<typename T>
class MyClass
{
public:
void Foobar(const T& a);
};
int main()
{
MyClass<int> myclass;
return 0;
}
它被编译成这样:
class MyClass_int // hypothetical class generated by compiler
{
public:
void Foobar(const int& a);
};
int main()
{
MyClass_int myclass;
return 0;
}
因此模板在编译的 C++ 代码的生成二进制文件中“不存在”。
在 .Net 中,同一行将导致编译器发出类的元数据,指示应在运行时替换泛型类型参数。实际上并没有听起来那么糟糕,因为 JIT 编译器应该能够巧妙地处理它们。
public class MyClass<T>
{
public void Foobar(T item) {}
}
这是用额外的信息编译的,表明它是一个通用类。 T
参数在运行时使用时填写:
// This specialization occurs at runtime
MyClass<int> myclass = new MyClass<int>();
.Net 泛型不会尝试复制所有 C++ 模板功能。 C++ 模板的功能更加强大,但使用起来却更加困难(C++ 模板实际上是 Turing-complete )。