日期:2014-05-20  浏览次数:20671 次

getClass的类型转换异常?
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 class Test1{
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
append(list);
System.out.println(list.get(0)……

------解决方案--------------------
我的观点是:泛型确实是在编译阶段用的,编译后都被编译器作优化处理。


比如以下代码
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编译器没那么傻 希望多给点分 嘿嘿
------解决方案--------------------
探讨
引用:
list.get(0).toString()会有异常,类型转换异常