- Java code
public class Test1{ public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); append(list); System.out.println(list.get(0)); } public static void append(List list){ list.add("0042"); }}
把
- Java code
System.out.println(list.get(0));
改成
- Java code
System.out.println(list.get(0)+1);
报类型转换异常,因为这么写只是骗过了编译器,因为泛型只是在编译器中起作用。
到这还是可以理解的。但是如果把
- Java code
System.out.println(list.get(0));
改成
- Java code
System.out.println(list.get(0).getClass());
则会报类型转换异常
到此我开始怀疑,有以下几个方向
1、如果getClass()只在jvm中运行,编译器不检查的话,那么泛型可能会代入jvm中
2、如果泛型不代入jvm,那么getClass()会在编译器被检查
在此,问问各位大侠,究竟怎么回事?
------解决方案--------------------
------解决方案--------------------
我的观点是:泛型确实是在编译阶段用的,编译后都被编译器作优化处理。
比如以下代码
- Java code
public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); append(list); System.out.println(list.get(0)); System.out.println(list.get(0)+1); Object o = list.get(0); System.out.println(o.getClass()); System.out.println(list.get(0).getClass()); } public static void append(List list) { list.add("0042"); }
------解决方案--------------------
上边说的已经很全面了,leisore 说的是对的
我再补充一点 ,java编译器很智能的 ,只有用到方法或者引用的时候才会强制类型转换
像这种System.out.println(list.get(0));是不会强制类型转换为Integer的 ,因为没有必要,java编译器没那么傻 希望多给点分 嘿嘿
------解决方案--------------------