开发出高质量的系统
在这篇文章中用Jad说明了JDK1.5中的泛型是擦拭法实现,实际是通过编绎前处理,或者编译器实现的。但有人说Jad还不支持1.5的语法,那么从另一个角度证明一下,就有了这篇文章。
posted on 2006-11-10 13:05 dreamstone 阅读(3618) 评论(5) 编辑 收藏 所属分类: jdk相关
对,对。就是擦拭法。编译时大部分元信息被擦拭了,不过继承和泛型方法的Generic Type还可以在编译后获取回来,这就挺够用了,但是够Tricky。 回复 更多评论
嗯,不过Java的实现方式导致的一个结果就是泛型只简化了代码,并没有提高效率。但是dot net利用C++类似的template的方式来实现,效率提升很大。 回复 更多评论
有没有效率提升测试了才知道.. 回复 更多评论
经过实际测试发现,JDK1.5泛型 确实比以前效率有所提升 代码如下:(这是没有采用泛型的代码,采用泛型只要改三个地方然后在测试) public static void main(String[] args){ //--测试JDK1.4 和 JDK5的性能... System.out.println(NormMisc.getStDateTime()); long startime = 0; long ttime = 0; for(int j=0;j<30;j++){ startime = System.currentTimeMillis(); for(int ii=0;ii<5000;ii++){ ArrayList l = new ArrayList(); for(int i=0;i<10;i++){ Car c = new Car(); c.setDesc("Desc");c.setName("name-"+i);c.setNumber("Number"); l.add(c); } for(int i = 0;i<l.size();++i){ Car c = (Car)l.get(i); String cs = c.toString(); //System.out.println(cs); } l.clear(); } ttime += (System.currentTimeMillis()-startime); } System.out.println(NormMisc.getStDateTime()); System.out.println("平均时间:"+ttime/10); } } class Car{ private String name; private String number; private String desc; /** * @return desc */ public String getDesc() { return desc; } /** * @param desc 要设置的 desc */ public void setDesc(String desc) { this.desc = desc; } /** * @return name */ public String getName() { return name; } /** * @param name 要设置的 name */ public void setName(String name) { this.name = name; } /** * @return number */ public String getNumber() { return number; } /** * @param number 要设置的 number */ public void setNumber(String number) { this.number = number; } public String toString(){ return "name "+name+",number "+number+",desc "+desc; } } 回复 更多评论
@a 先不管你这段代码写的如何,逻辑上就有问题,jdk1.5编绎后比jdk1.4运行快就一定是因为泛型吗? 就用你这段代码,不使用泛型的情况下,你用jdk1.4和 jdk1.5分别编绎运行一下看到差别了吧。差别不是因为泛型,而是因为别的原因。不要只看表面现象,要知到原因。 回复 更多评论
Powered by: BlogJava Copyright © dreamstone