我正在尝试调试Java中涉及ClassCastException的问题。为了解决这个问题,我需要知道当我从Object转换为特定类型时会发生什么。 有人可以向我解释Java强制转换操作符在Java级别和JVM级别上的工作原理吗?
答案 0 :(得分:10)
答案 1 :(得分:6)
类转换神秘化的一个可能原因是,不仅类型必须匹配,而且它们必须由同一个类加载器加载。
您不仅可以转储类型层次结构,还可以转储每个类的类加载器的标识。
这些问题在appserver风格的环境中并不少见,因为应用程序代码和基础结构代码是故意隔离的 - 例如,如果系统类意外地包含在applciation JAR中,您可以在JVM中拥有两个“相同”类的副本,生活变得混乱
答案 2 :(得分:3)
其他有用和权威的参考资料可在Java虚拟机规范中找到,特别是§2.6.5, "Narrowing Reference Conversions",,尤其是checkcast
指令的定义。
答案 3 :(得分:3)
Casting断言对象的运行时类型与给定的静态类型兼容,因此允许您在对象上调用该类型的方法。
这里obj是一个Integer对象,但只能通过Object引用访问:
Object obj = new Integer(1);
Casting允许您再次将其视为Integer(或Integer的某个超类):
System.out.println(((Integer) obj).intValue());
当给定的静态类型与对象的运行时类型不匹配时,ClassCastException会出现:
System.out.println(((Float) obj).intValue()); // runtime error
您可以使用getClass()和各种Class方法找到任何对象的运行时类型:
System.out.println(obj.getClass()); // prints "class java.lang.Integer"