[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>();
MyClass<Foo> *foo2 = new MyClass<Foo>();
MyClass<Bar> *bar1 = new MyClass<Bar>();
MyClass<Bar> *bar2 = new MyClass<Bar>(); 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 ;
}
而在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
}
由于架构的不同,Java的泛式编程和C++的模板还有许多不同:
- C++可以使用主要类型,例如int,而Java只能使用Integer
- Java中,你可以限制模板的参数类型为一个确定的类型。例如,你可能使用泛式编程来实现一个CardDeck,限定其参数类型必须从CardGame派生过来。
- C++中的参数类型可以被实例化,而Java中的不行。
- 在Java中,参数类型(例如MyClass<Foo>中的Foo)不能用于静态方法或变量,因为这些会被MyClass<Foo>和MyClass<Bar>所共享。而C++中这些类是不同的,所以可以用于静态方法或变量中。
- 在Java中,MyClass的所有实例,不管其参数类型是什么,都是同一个类型,其参数类型在运行时被擦除了。而C++中,拥有不同参数类型的实例是不同的类型。
[CareerCup] 14.4 Templates Java模板的更多相关文章
- [CareerCup] 14.2 Try-catch-finally Java中的异常处理
14.2 In Java, does the finally block get executed if we insert a return statement inside the try blo ...
- *关于httl开源Java模板的使用心得
1.简介 HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似. ...
- httl开源JAVA模板引擎,动态HTML页面输出
HTTL(Hyper-Text Template Language)是一个适用于HTML输出的开源JAVA模板引擎,适用于动态HTML页面输出,可用于替代JSP页面,它的指令类似于Velocity. ...
- springboot:Java模板引擎Thymeleaf介绍
Thymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎.类似JSP,Velocity,FreeMaker等,它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用 ...
- 新一代Java模板引擎Thymeleaf
新一代Java模板引擎Thymeleaf-spring,thymeleaf,springboot,java 相关文章-天码营 https://www.tianmaying.com/tutorial/u ...
- jetbrick,新一代 Java 模板引擎,具有高性能和高扩展性
新一代 Java 模板引擎,具有高性能和高扩展性. <!-- Jetbrick Template Engineer --> <dependency> <groupId&g ...
- Java 模板引擎 jetbrick-template
jetbrick-template 是一个新一代 Java 模板引擎,具有高性能和高扩展性. 适合于动态 HTML 页面输出或者代码生成,可替代 JSP 页面或者 Velocity 等模板. 指令和 ...
- Java模板引擎 HTTL
新一代java模板引擎典范 Beetl http://www.oschina.net/p/httl HTTL(Hyper-Text Template Language)是一个高性能的开源JAVA模板引 ...
- Ubuntu 14.04下java开发环境的搭建--3--Tomcat及MySQL的安装
前面两篇文章,已经说明了JDK和Eclipse 的安装方法,下面简单说一下,Tomcat及MySQL的安装方法. Tomcat的安装. 在合适的地方解压apache-tomcat-6.0.39.tar ...
随机推荐
- animation of android (2)
android Interpolator 首先是android系统提供的变换方式: 这些方式将转载一篇文章: 转: http://www.cnblogs.com/mengdd/p/3346003.ht ...
- 转 自定义View之onMeasure()
可以说重载onMeasure(),onLayout(),onDraw()三个函数构建了自定义View的外观形象.再加上onTouchEvent()等重载视图的行为,可以构建任何我们需要的可感知到的自定 ...
- ubuntu wireshark finish
http://blog.csdn.net/cumirror/article/details/4694283 安装编译工具: $sudo apt-get install build-essential ...
- 20150912华为机考1之"输入一个字符串,将其中出现次数最多的字符输出"
不吐槽华为的服务器了,直接上正文 输入:字符串(英文字母),长度不超过128 输出:出现频率最高的字母 思路写在注释文档 /* Input a string * Output the most fre ...
- [转]GridView排序——微软提供Sort
本文转自:http://www.cnblogs.com/eva_2010/articles/1995646.html 在GridView中,根据其中的某列进行排序. 1. 页面:AllowSortin ...
- java coder的水平
写java写了也12年了,不决的自己是高手,但是也体会了一些变化.总的来说,Java可以分成几个层次: 首先是需求理解层次,这个层次的coder能理解需求,把需求转化成代码: 第二个层次是单测,能够对 ...
- tarjan算法求割点cojs 8
tarjan求割点:cojs 8. 备用交换机 ★★ 输入文件:gd.in 输出文件:gd.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] n个城市之间有通讯网 ...
- IT技术博客收藏
1. coolshell.cn 特点: 每篇都是精品 2. 云风 特点: 3. 阮一峰的博客 特点:高精深 3. offbye涛声依旧-全端技术博客 特点: android的开发技术比较多,非常值得一 ...
- 准备写一些读书笔记,最近在填坑 SQL学习指南 Spring in Action effective Java
把一些读书的理解通过白板图的形式展示出来,加深自己的认识, 因为目前没有工程项目练手,暂时在学习中把这些知识深化认识一下
- Saltstack-进阶篇
查看minion端的文件内容 [root@linux-node2 ~]# cat /etc/resolv.conf # Generated by NetworkManager nameserver 1 ...