当前位置: 代码迷 >> J2SE >> getClass的类型转换错误
  详细解决方案

getClass的类型转换错误

热度:18   发布时间:2016-04-24 12:24:41.0
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()会有异常,类型转换异常
  相关解决方案