Java的Generics和c++的Template到底有什么不同?
来源:互联网 发布:新视野大学英语软件 编辑:程序博客网 时间:2024/06/10 18:45
先了解Java的Generics:
根据Java的文档,Java引入Generics一是为了在编译时提供更强的类型检查,二是为了泛型编程。
编译时,Java靠type erasure来实现Generics:
1. 将所有的泛型参数替换为限定(bound这里如何翻译?)的类型,如果没有限定,就替换为Object类。因此然生的字节码和普通的类文件一样;
2. 为了保证类型安全,必要的时候会是使用cast;
3. 为了维护继承的泛型类型之间的多态的正确性,必要的时候会生成bridge methods。
考虑下面的泛型类,这个类代表单链表的节点。(一下例子均出自java doc)
因为T没有被限定,所以Java编译器将其替换为Object:
根据Java的文档,Java引入Generics一是为了在编译时提供更强的类型检查,二是为了泛型编程。
编译时,Java靠type erasure来实现Generics:
1. 将所有的泛型参数替换为限定(bound这里如何翻译?)的类型,如果没有限定,就替换为Object类。因此然生的字节码和普通的类文件一样;
2. 为了保证类型安全,必要的时候会是使用cast;
3. 为了维护继承的泛型类型之间的多态的正确性,必要的时候会生成bridge methods。
考虑下面的泛型类,这个类代表单链表的节点。(一下例子均出自java doc)
- public class Node<T> {
- private T data;
- private Node<T> next;
- public Node(T data, Node<T> next) }
- this.data = data;
- this.next = next;
- }
- public T getData() { return data; }
- // ...
- }
public class Node<T> { private T data; private Node<T> next; public Node(T data, Node<T> next) } this.data = data; this.next = next; } public T getData() { return data; } // ...}
因为T没有被限定,所以Java编译器将其替换为Object:
- public class Node {
- private Object data;
- private Node next;
- public Node(Object data, Node next) {
- this.data = data;
- this.next = next;
- }
- public Object getData() { return data; }
- // ...
- }
public class Node { private Object data; private Node next; public Node(Object data, Node next) { this.data = data; this.next = next; } public Object getData() { return data; } // ...}
- Java的Generics和c++的Template到底有什么不同?
- Java的generics跟C++的template有何区别?
- 传统语言的编译和执行方式和C#、Java有什么不同?
- CIO和CTO到底有什么不同?
- Java的接口到底有什么意义
- C,C++和java到底有什么差别
- Java创建对象的方式和C++有什么不同
- java的awt和swing有什么不同
- java的awt和swing有什么不同呢?
- java中++和+=的执行原理有什么不同?
- java的awt和swing有什么不同
- C和C++到底有什么关系
- C和C++到底有什么关系
- 80端口与8080端口是两种不同的端口吗?他们到底有什么区别和联系?
- 文本格式和二进制格式到底有什么不同
- 仔细思考一个接口的不同实现得到的类和一个类的不同对象使用起来到底有什么区别?
- 广告联盟的CPL和CPA到底有什么区别
- Web Service和WCF的到底有什么区别
- 《易道客》源码剖析之四:页面多次跳转的记忆
- Ext js高度不够导致页面元素显示不完全
- 2012年年度总结
- Apache二级域名配置
- hql tips
- Java的Generics和c++的Template到底有什么不同?
- Java汉字转换为拼音
- 在Red Hat Enterprise Linux 5.8上安装systemtap
- 2013过年回家收获
- Java Thread
- C++之函数指针
- Java规则引擎工作原理及其应用(转)
- 关于java中边界值校验的问题
- java-synchronized修饰方法释疑