Java强制转换操作符如何工作?

时间:2009-05-08 15:15:30

标签: java casting jvm

我正在尝试调试Java中涉及ClassCastException的问题。为了解决这个问题,我需要知道当我从Object转换为特定类型时会发生什么。 有人可以向我解释Java强制转换操作符在Java级别和JVM级别上的工作原理吗?

4 个答案:

答案 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"