admin 发表于 2013-3-11 00:19
你可以做一个实验,写一个类A和B,如下:
package com.itheima.bean;
看到你这么解说,我似乎有上点明白,下面是我的对泛型运行的理解,不知这样解释行不行得通
1、以前笔记记下的个人的理解:
既然泛型是给编译器看的,编译后的代码也是确定,也没有泛型信息,那不同类型的实参调用同一份代码是怎么做到?我想是编译在编译时根据实际被不同类型实参调用,就会生成相对应不同的多份代码,这样子程序员只写一份,就可以达到被不同类型的参数调用。这样做好像行得通,但不确实不合理,生产的代码太垃圾,sun公司不可能这样子做吧
2、现在的理解:
根据你所说的以及上面代码执行的效果来看:
a、先首编译给根据被定义了泛型的成分上的泛型信息保存到字节码中的一部分(这里可以说是被编译器看的),然后把去掉泛型信息的源代码编译成字节码中的另一部分(类)。
b、那这两部分是怎么联系起来的?我想泛型信息那部分会以某种方式记住某些成分是始何被定义的,当我们调用实参时,JVM会根据传
过来的实参信息及调用那个成分(应该是地址,这样才能找到相应成分),再到字节码中泛型信息部分查找正在被调用的成分的泛型是如何被定义的,
再根据找泛型信息及实参匹配到正被调用的成分上,也就是说在执行的时才能确定参数类型。
c、另我认为实应用了泛型的成分,编译后是没法确定的参数类型,因为编译根本都没知道参数是什么类型的;
虽然泛信息和类的信息在字节码中是分开的,但这时生成类那部分的代码与普通的代码还是有区别的,那就是普通代码本身就有参数类型信息,而应用泛型的代码没有。
d、最后,如果我上面的理解是正确的,那么这我认为“泛型是给编译器看的,”这句话不是很准确,但为了便于学习,我觉得这么说还是行得通的。
如理解有误之处,强烈希望更正!! |