[CareerCup] 14.4 Templates Java模板

简介:

14.4 Explain the difference between templates in C++ and generics in Java.

在Java中,泛式编程Generic Programming的实现是通过一种就做类型擦除Type Erasure的机制来实现的。当源码转为Java虚拟机JVM的字节代码时擦除参数的类型,例如下面的例子:

Vector<String> vector = new Vector<String>();
vector.add(new String("hello"));
String str = vector.get(0);

在编译过程中,被重写为:

Vector vector = new Vector();
vector.add(new String("hello"));
String str = (String) vector.get(0);

这跟C++中有很大的不同。在C++中,模板是一个宏设置Macro Set,编译器对每一个类型的模板代码都创建一份拷贝。验证这一点可以通过以下事实: MyClass<Foo>的一个实例不会跟MyClass<Bar>共享一个静态变量,但是两个MyClass<Foo>之间会共享一个静态变量,参见如下代码:

template<class T>
class MyClass {
public:
    static int val;
    MyClass(int v) { val = v; }
};

template<typename T>
int MyClass<T>::val;
class Foo;
class Bar;
int main() {

    MyClass<Foo> *foo1 = new MyClass<Foo>(10);
    MyClass<Foo> *foo2 = new MyClass<Foo>(15);
    MyClass<Bar> *bar1 = new MyClass<Bar>(20);
    MyClass<Bar> *bar2 = new MyClass<Bar>(35);
    
    cout << foo1->val << endl; // will equal 15
    cout << foo2->val << endl; // will equal 15
    cout << bar1->val << endl; // will equal 35
    cout << bar2->val << endl; // will equal 35
    
    return 0;
}

而在Java中,静态变量会在所有的MyClass的实例中共享,不论其参数是否相同,参见下列代码:

public class Foo {}
public class Bar {}

public static class MyClass<T> {
    public static int val;
    public MyClass(int v) { val = v; }
}
public static void main (String[] args) {
    System.out.println("Hello World!");
    MyClass<Foo> foo1 = new MyClass<Foo>(10);
    MyClass<Foo> foo2 = new MyClass<Foo>(15);
    MyClass<Bar> bar1 = new MyClass<Bar>(20);
    MyClass<Bar> bar2 = new MyClass<Bar>(35);
    
    System.out.println(foo1.val); // will equal 35
    System.out.println(foo2.val); // will equal 35
    System.out.println(bar1.val); // will equal 35
    System.out.println(bar2.val); // will equal 35
}

本文转自博客园Grandyang的博客,原文链接:Java模板[CareerCup] 14.4 Templates,如需转载请自行联系原博主。

相关文章
|
Java
有关Java发送邮件信息(支持附件、html文件模板发送)
有关Java发送邮件信息(支持附件、html文件模板发送)
812 1
|
Java
Java代码设定固定模板
Java代码设定固定模板
125 0
java发送微信公众号模板消息
java发送微信公众号模板消息
254 0
|
存储 Java
Dijkstra最短路径(Java)(详细+模板)
Dijkstra最短路径(Java)(详细+模板)
223 4
|
机器学习/深度学习 算法 Java
全排列(分治)(Java语言 +全排列模板)
全排列(分治)(Java语言 +全排列模板)
99 2
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
333 6
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
669 1
|
Java
Java PDF模板生成PDF
Java PDF模板生成PDF
264 1
|
小程序 Java
【aspose-words】Aspose.Words for Java模板语法详细剖析
本文通过详细分析Aspose.Words for Java模板语法,介绍了使用条件块、变量和动态合并表格单元格三个常用模板标签,并结合实际案例进行演示。通过这三个标签的实操,帮助读者更好地掌握Aspose.Words的使用技巧。此外,还提供了官方文档链接以便进一步学习。
498 0
【aspose-words】Aspose.Words for Java模板语法详细剖析