【C++, Java】C++模板和Java泛型之间有何不同?
来源:互联网 发布:国家中医药大数据平台 编辑:程序博客网 时间:2024/06/06 02:56
转自:http://blog.csdn.net/michellechouu/article/details/47044331
许多人都认为模板template和泛型generic这两个概念是等价的,因为两者都允许我们按照List<String>的样式编写代码。
不过,各种语言是怎么实现该功能,以及为什么这么做,却千差万别。
Java的泛型的实现根植于“类型消除”这一概念。当源代码被转换成Java虚拟机字节码时,这种技术会消除参数化类型。
例如,假设有一下java 代码:
编译时,上面的代码会被改写为:
有了Java泛型,我们可以做的事情也并没有真正改变多少;它只是让代码变得漂亮些。鉴于此,Java泛型有时也被成为”语法糖“。
这点跟C++的模板截然不同。
在C++中,模板本质上就是一套宏指令集,只是换了个名头,编译器会针对每种类型创建一份模板代码的副本。
有个证据可以证明这一点:MyClass<Foo>不会与MyClass<Bar>共享静态变量。然而,两个MyClass<Foo>实例则会共享静态变量。
但在Java中,MyClass类的静态变量会由所有MyClass实例共享,无论类型参数相与否。
由于架构设计上的差异,Java泛型和C++模板还有如下很多不同点;
1. C++模板可以使用int等基本数据类型。Java则不行,必须转而使用Integer
2. Java中,可以将模板的类型参数限定为某种特定类型。例如,你可能会使用泛型实现CardDeck,并规定参数必须扩展自CardGame。
3. C++中,类型参数可以实例化,Java不可以实例化
4. Java中,类型参数(即MyClass<Foo>中的Foo)不能用于静态方法和变量,因为他们会被MyClass<Foo>和MyClass<Bar>共享。但在C++中,这些类是不同的,类型参数可以用于静态方法和静态变量。
5. 在Java中,不管类型参数是什么,MyClass的所有实例都是同一类型。类型参数会在运行时被抹去。而C++中,参数类型不同,实例类型也不同
Java的泛型和C++模板,虽然在很多方面看起来都一样,实则大不相同。
- 【C++, Java】C++模板和Java泛型之间有何不同?
- 【C++, Java】C++模板和Java泛型之间有何不同?
- c++模板和java泛型之间有何不同
- 程序员面试金典——解题总结: 9.14 Java 14.4C++模板和Java泛型之间有何不同?
- Java中Ear、Jar、War文件之间有何不同
- Java中Ear、Jar、War文件之间有何不同?
- Java中Ear、Jar、War文件之间有何不同?
- Java中Ear、Jar、War文件之间有何不同
- Java中Ear、Jar、War文件之间有何不同
- Java中Ear、Jar、War文件之间有何不同
- Java中Ear、Jar、War文件之间有何不同
- Java编译过程与c/c++编译过程有何不同
- Java编译过程与c/c++编译过程有何不同
- java和javac的-classpath选项有何不同
- java : spring roo 和 spring boot 有何不同
- Java中直接赋值和new有何不同?
- interface和abstract class有何不同? (C/C++) (.NET) (C#)
- Java一维数组和二维数组作为方法参数有何不同
- 【Java Utility】Jsoup网页爬虫工具--文档解析及转换【二】
- Eclipse常用快捷键整理
- svn插件 myeclipse 官网下载
- JAVA 细节整理
- TabLayout的使用
- 【C++, Java】C++模板和Java泛型之间有何不同?
- Android Bander设计与实现
- docker的三大组件:镜像,容器,仓库
- 责任链模式综述(基础篇)
- 数组间的相互转换
- 数据库并发问题以及数据库的隔离机制
- 最全最好用的Android Studio插件整理
- 从PHP与Python的语言比较去了解什么是图灵完备
- 【Objective-C】NSDate详解及获取当前时间等常用操作