Java的Generics和c++的Template到底有什么不同?
2013-02-18 20:23
393 查看
先了解Java的Generics:
根据Java的文档,Java引入Generics一是为了在编译时提供更强的类型检查,二是为了泛型编程。
编译时,Java靠type erasure来实现Generics:
1. 将所有的泛型参数替换为限定(bound这里如何翻译?)的类型,如果没有限定,就替换为Object类。因此然生的字节码和普通的类文件一样;
2. 为了保证类型安全,必要的时候会是使用cast;
3. 为了维护继承的泛型类型之间的多态的正确性,必要的时候会生成bridge methods。
考虑下面的泛型类,这个类代表单链表的节点。(一下例子均出自java doc)
Java代码
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:
Java代码
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的文档,Java引入Generics一是为了在编译时提供更强的类型检查,二是为了泛型编程。
编译时,Java靠type erasure来实现Generics:
1. 将所有的泛型参数替换为限定(bound这里如何翻译?)的类型,如果没有限定,就替换为Object类。因此然生的字节码和普通的类文件一样;
2. 为了保证类型安全,必要的时候会是使用cast;
3. 为了维护继承的泛型类型之间的多态的正确性,必要的时候会生成bridge methods。
考虑下面的泛型类,这个类代表单链表的节点。(一下例子均出自java doc)
Java代码
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:
Java代码
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到底有什么不同?
- C#和java,C#和C++各有什么不同(1) -- C#、C++和Java
- Java创建对象的方式和C++有什么不同
- Java和C++声明一个对象有什么不同
- C#和java,C#和C++各有什么不同(2) -- 语言规范的比较
- 什么是无符号段整数,什么又是有符号数,(c++与java语言里边的不同)
- java中的class 与Class , A.class 与 A.getClass() 到底有什么 不同
- C#和java,C#和C++各有什么不同(3) -- Java没有的功能
- C#, Java 和 c++的特点,有什么相同的地方?不同的地方?C#分别从c++和java中吸取了他们那些优点?
- C#和java,C#和C++各有什么不同
- Java的generics跟C++的template有何区别?
- C++和Java有什么不同
- Java与C++的不同
- java到底学什么??
- java中hashCode和equals什么关系,hashCode到底怎么用的
- 【C++, Java】C++模板和Java泛型之间有何不同?
- Java与C/C++不同的一些基础知识点
- c++中箭头操作符(->)和点操作符(.)有什么不同
- JVM - 2. java堆栈里面到底有什么
- 内部类:Java和C++的不同实现