Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaCast操作符是如何工作的?_Java_Casting_Jvm - Fatal编程技术网

JavaCast操作符是如何工作的?

JavaCast操作符是如何工作的?,java,casting,jvm,Java,Casting,Jvm,我试图调试一个涉及Java中ClassCastException的问题。为了解决这个问题,我需要知道当我从对象转换到特定类型时发生了什么有人能向我解释一下Java cast操作符是如何在Java级别和JVM级别工作的吗?这是否足够好 强制转换应用于强制转换运算符的操作数(§15.16):操作数表达式的类型必须转换为强制转换运算符显式命名的类型。强制转换上下文允许使用: 身份转换(§5.1.1) 扩大原语转换(§5.1.2) 缩小原语转换(§5.1.3) 加宽参考转换(§5.1.5)后可选地进行

我试图调试一个涉及Java中ClassCastException的问题。为了解决这个问题,我需要知道当我从对象转换到特定类型时发生了什么有人能向我解释一下Java cast操作符是如何在Java级别和JVM级别工作的吗?

这是否足够好

强制转换应用于强制转换运算符的操作数(§15.16):操作数表达式的类型必须转换为强制转换运算符显式命名的类型。强制转换上下文允许使用:

  • 身份转换(§5.1.1)
  • 扩大原语转换(§5.1.2)
  • 缩小原语转换(§5.1.3)
  • 加宽参考转换(§5.1.5)后可选地进行未经检查的转换(§5.1.9)
  • 缩小参考转换(§5.1.6)后可选地进行未经检查的转换
  • 装箱转换(§5.1.7)
  • 拆箱转换(§5.1.8)
实际上,也许更相关:

编译时引用类型S的值转换为编译时引用类型T的转换的编译时合法性的详细规则如下: 如果 S是类类型:
  • 如果T是 一个类类型,然后是|
    Java虚拟机规范中还提供了其他有用的权威参考,特别是指令的定义。

    Casting断言对象的运行时类型与给定的静态类型兼容,因此允许您在对象上调用该类型的方法

    此处obj是一个整数对象,但只能通过对象引用访问:

    Object obj = new Integer(1);
    
    通过强制转换,您可以再次将其视为整数(或整数的某个超类):

    当给定的静态类型与对象的运行时类型不匹配时,ClassCastException occours:

    System.out.println(((Float) obj).intValue()); // runtime error
    
    通过使用getClass()和各种类方法,可以找到任何对象的运行时类型:

    System.out.println(obj.getClass()); // prints "class java.lang.Integer"
    

    类强制转换神秘化的一个可能原因是,不仅类型必须匹配,而且它们必须由相同的类加载器加载


    您不仅应该能够转储类型层次结构,还应该能够转储每个类的类加载器的标识


    这些问题在appserver风格的环境中并不少见,在这些环境中,应用程序代码和基础结构代码被故意隔离——例如,如果系统类意外地包含在application jar中,那么您可以拥有两个“相同”的副本在JVM中创建类,生活会变得混乱

    请给出一个发生这种情况的实例。例如,什么类是特定类型,什么类是对象?亚当,我可能会问一个后续问题。本质上,我是从Spring创建一个类型为“com.generic.MyType”的bean,但转换为(MyType)失败。我认为这可能是Spring的问题,而不是Java的问题,但我正在努力彻底解决。@nemo:我知道这很明显,但在源代码中,您是否已将MyType导入顶部的com.generic.MyType?或者您导入了多个包(import org.generic.*;import org.other.*;),其中可能包含多个名为MyType的类,并且编译器可能选择了错误的类?@Adam,实际上我没有为强制类型导入,如果我导入它,Netbeans会说它未使用。但是,该错误无法强制转换为com.generic.MyType。今天晚些时候,我可能会发布一些真实细节的问题,如果我不能取得任何进展,我会在这里给你一个链接。@nemo:请这样做;这样我们可能会帮你更多的忙。嗯。。。我删除了第二部分的所有链接,但我不知道第一部分出了什么问题。如果有人知道为什么链接会出现异常,请继续修复它!也许它不喜欢锚定标签?但是没有锚定标签;我已经将它们全部剥离了。“您不仅应该能够转储类型层次结构,还应该能够转储每个类的类加载器的标识。”如何实现这一点?这是一个很好的建议,但是在运行.getClassLoader()之后在它们上面,两个类似乎都是由同一个类加载器加载的。
    System.out.println(obj.getClass()); // prints "class java.lang.Integer"