`
binbin8497
  • 浏览: 46451 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

c# Java 中的泛型与 C++ 模板的比较

    博客分类:
  • java
阅读更多

GJ(Generic Java)是对 Java 语言的一种扩展,是一种带有参数化类型的 Java 语言。

Generic Java 程序的语法在表面上与 C++ 中的模板非常类似,但是二者之间有着本质的区别。

首先,Java 语言中的泛型不能接受基本类型作为类型参数――它只能接受引用类型。这意味着可以定义 List<Integer>,但是不可以定义 List<int>。

其次,在 C++ 模板中,编译器使用提供的类型参数来扩充模板,因此,为 List<A> 生成的 C++ 代码不同于为 List<B> 生成的代码,List<A> 和 List<B> 实际上是两个不同的类。而 Java 中的泛型则以不同的方式实现,编译器仅仅对这些类型参数进行擦除和替换。类型 ArrayList<Integer> 和 ArrayList<String> 的对象共享相同的类,并且只存在一个 ArrayList 类。

 

C++ 模板与 C# 泛型存在着显著的差别。C# 泛型被编译成中间语言 IL,这使得在运行时会智能地为每个值类型创建相应的专用类型,而为引用类型只会创建一次专用类型;C++ 模板实际上是代码扩展宏,它为提供给模板的每个类型参数生成一个专用类型。因此,当 C++ 编译器遇到模板(例如整数 Stack)时,它会将模板代码扩展为 Stack 类并将整数作为该类本身的类型包含在其中。无论类型参数是值类型还是引用类型,如果不专门设计链接器来降低代码膨胀速度,C++ 编译器每次都会创建一个专用类,从而导致比使用 C# 泛型更显著的代码膨胀速度。

而且,C++ 模板不能定义约束。C++ 模板只能通过使用一个成员(可能属于也可能不属于类型参数),隐式定义约束。如果最终传递给泛型类的类型参数中存在该成员,程序将正常运行。否则,程序将失败,并可能返回隐藏的错误信息。由于 C# 泛型可以声明约束,并且具有严格的类型,因此不存在这些潜在的错误。

 

 

分享到:
评论

相关推荐

    快速了解泛型(C#,JAVA,C++)

    C++模板可以在类和函数级别使用,甚至可以有模板模板。例如,一个简单的泛型栈可以这样实现: ```cpp template class Stack { private: std::vector&lt;T&gt; elements; public: void push(const T& value); T pop();...

    细细品味C#(泛型专题)

    - **简洁性**:相比于 C++ 模板,C# 泛型更加简单易懂,更适合日常应用开发,虽然缺少一些高级特性,但满足大多数需求。 - **类型安全性**:C# 泛型提供了更好的类型安全性,减少了运行时错误的可能性。 - **...

    品味C#(泛型专题)

    #### 关于C#与Java泛型的比较 C#与Java作为两大主流编程语言,在泛型的实现上各有千秋,但C#自2.0版本起引入的泛型特性,无疑使其在类型安全性和代码重用性方面迈出了重要的一步。《品味C#(泛型专题)》一书深入...

    解析Java泛型的类型擦除.pdf

    Java 泛型是 Java SE 1.5 的新特性,它们在语法和应用环境上与 C++ 中的模板相似,但是本质上它们之间有着区别,这种区别就在于 Java 泛型的类型擦除。 Java 泛型的类型擦除是 Java 语言中的一种机制,它使得泛型...

    C#泛型专题

    例如,Java 提供了 `extends` 和 `super` 关键字来限定泛型参数的上下界,这是 C# 和 C++ 模板所不具备的功能。 - **示例:**文中提到了一个具体的例子,展示了如何在 Java 中利用 `? extends A` 来解决不同类型的...

    一些c# c++ java的笔试试题 希望对大家有用

    在IT行业中,编程语言是构建软件的基础工具,而C#、C++和Java这三种语言在不同的领域都有着广泛的应用。这些语言各有特色,各有优势,同时也各有挑战。本压缩包中包含了一些关于C#、C++和Java的笔试试题,旨在帮助...

    泛型编程技术

    在C#中,泛型的使用与Java类似,但C#还支持泛型接口和泛型委托。例如,`List&lt;T&gt;`是C#中的一个泛型类,`IEnumerable&lt;T&gt;`是泛型接口。 C++的模板机制是泛型编程的基础,它可以用于创建泛型类(模板类)和泛型函数...

    C#和 Java比较

    首先,C#和Java都支持面向对象编程,但C#在设计上更加靠近C++,提供了一些C++的特性,比如模板和指针(但C#的指针使用受到限制)。Java则没有提供C++那样的指针,而是使用引用作为对象的访问方式。在继承方面,两者...

    设计模式C++、C#、java(中、英文)免费

    这些模式已经被广泛接受,并在各种编程语言中得以应用,包括C++、C#和Java。本资源包提供了这些设计模式的中英文版,对学习和理解设计模式有极大的帮助。 1. **Java设计模式.pdf**: 这本书或文档可能详细介绍了...

    Java VB C# Javascript C++编程源码网址大全

    Java、VB(Visual Basic)、C#、JavaScript和C++是五种非常流行的编程语言,各有其特点和应用领域。这些语言的源码网址大全提供了丰富的资源,对于学习者和开发者来说是非常宝贵的财富。 1. Java:作为一种跨平台的...

    C++的类与C#的类

    C#是在C++的基础上发展起来的一种语言,它保留了C++的一些面向对象特性,如模板(在C#中称为泛型),但对类的创建和使用进行了显著改进。C#简化了类的语法,引入了更多的访问修饰符来增强封装性和安全性。 #### 类...

    泛型教程2.0

    C#的泛型机制由Common Language Runtime (CLR)支持,在运行时动态实例化泛型类型,这与C++的编译时模板机制和Java的“擦拭法”不同。C#的泛型代码在编译为中间语言(IL)时,使用特殊占位符表示泛型类型,直到JIT编译...

    C#编程规则与技巧

    此外,C#通过“基类、接口、构造器、值类型/引用类型”的约束方式来实现对类型参数的显示约束,提高了类型安全,但也牺牲了C++模板基于“签名”的隐式约束的灵活性。 在泛型的基本使用方法上,C#中可以定义泛型类和...

    设计模式代码大全(C++,JAVA,C#)

    此外,C#中的泛型特性使得模板方法模式(Template Method)和策略模式的实现更加简洁高效。 4. **设计模式分类**:设计模式通常分为三类:创建型、结构型和行为型。创建型模式涉及对象的创建,如单例、工厂和建造者...

    自测试卷5.doc1.简述C#、Java和C++的比较。 2.已知变量x的初值为24,则表达式x+=x--+=x%=17运算的结果值为( )。

    1. **C#、Java和C++的比较** C#、Java和C++都是流行的编程语言,但它们各有特点。C++是静态类型语言,强调底层控制和性能,支持模板和多重继承。Java是跨平台的动态类型语言,注重安全性,有自动垃圾回收机制,不...

    C#,.net,Java,C++,华为面试题大全

    在IT行业中,编程语言是构建软件系统的基础,而C#、.NET、Java、C++是其中非常重要的四种。华为作为全球领先的电信解决方案供应商和IT设备制造商,对这些技术有深厚的依赖,因此对于求职者来说,熟悉并掌握这些语言...

    代码行统计(delphi C C++ C# java)

    本文将详细探讨如何统计Delphi、C、C++、C#和Java等编程语言的代码行,并分析这些统计结果的意义。 1. **Delphi代码行统计** Delphi是一种基于Object Pascal的集成开发环境,它的代码行统计通常包括源代码文件(....

    我的笔记-qt-c++-c#-后面持续更新.7z

    7. **泛型**:与C++模板类似,用于创建类型安全的代码。 8. **Unity引擎相关**:C#在游戏开发中的应用,如MonoBehavior、GameObjects和脚本交互。 综合来看,这个压缩包包含的笔记将涉及这三个领域的大量内容,无论...

Global site tag (gtag.js) - Google Analytics