最近一个朋友做猜数字游戏的解法,我也尝试了一下,在做数据生成器的时候,就希望做一个类型无关的,其实这个问题在去迅雷面试的时候就被问到,不过当时想都没想就放弃了,虽然面试当天回来的时候,完成了一下,但结果还是差强人意。所以想借这个机会弄一下。
在记录一条数据(Record)的时候,我本来使用了 List 实例化成 ArrayList,然后开始算,不过借助 JProbe 看了一下,List.size() 和 List.get(i) 这两个方法因为调用次数太多而占用了大部分的时间,所以第一想法是改成数组。
当我 new Record 的时候,使用的是 list ,自然想把这个 List<T> 转换成数组 T[] ,不过非常麻烦的是 list.toArray(T[]) 中的 T[] 不知道如何得到,不知道如何弄到 T[] 的实例,new T[list.size()] 是没办法的。
第一个反应是从 list 或是 List<T> 定义的 class 中得到成员的类型,然后使用 Arrays.newInstance 来创建一个,我花了好长的时间都没有能够得到,后来和同事聊天时,猜测是不是编译完的 class 文件中根本就没有类型的信息,不过当时没能确定。
晚上接着猜数字的时候,旧事重提,google 了一下,看到了一个非常好的文章。
http://www.ibm.com/developerworks/cn/java/j-jtp01255.html将泛型说明的非常清楚,其中一句是这样的“Java 语言中的泛型基本上完全在编译器中实现,由编译器执行类型检查和类型推断,然后生成普通的非泛型的字节码。这种实现技术称为
擦除(erasure)(编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除)”。
验证了我的想法,在 class 文件中,根本就没有泛型的信息。
实际上,声明一个泛型数据的方法是
T[] array = (T[])new Object[length];
这样,问题解决,对 Java 泛型的理解增加了一些。
posted on 2007-08-08 00:39
哈哈的日子 阅读(3895)
评论(3) 编辑 收藏 所属分类:
Java