日记写完
总结发下
泛型是编译器类型擦除
在编译期间,当需要调用这个泛型类的方法时,编译期间编译器会在编写二进制文件即.class文件时用泛型类自身方法的二进制码,即进行一次强转(E) elementData[index],所以在调用时会有类型转换异常。而不需要调用方法时,执行的时候也只是按最原始(和非JDK1.5泛型的一样),没有类型转换,该怎么样怎么样,所以没有转换异常。另外在代码System.out.println(list.get(0));,根据实验发现,它会编译期间做判断,如果泛型类是String类型则不做类型转换直接输出,如果不是则认为是Object类型需要使用toString方法打印,其实原理是调用不同的方法一个为:println(Object x),另一个为:println(String x)。使用println(Object x)方法它并不是在编译期间调用泛型类的toString的二进制码,而在运行期间调用实际类自己的toString方法,有点类似于多态,以Object为父类,调用子类实际的方法;总结:泛型类如果不是String时,则编译时按照参数为Object的方法进行编译,然后运行期间多态调用子类的toString方法,正常执行;泛型类如果是String时,编译时按照参数为String的方法进行编译,然后运行期间直接打印,但是实际类型不是String,则抛出转换异常。以上仅为个人猜想,期待大家的交流。
|