您的位置:首页 > 编程语言 > C语言/C++

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; }

// ...
}

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; }
// ...
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: