执行下面的代码时,代码执行完美而没有任何错误,但是对于List< Integer>类型的变量. ,get()方法的返回类型应该是Integer,但是在执行此代码时,当我调用x.get(0)时会返回一个字符串,而这应该抛出异常.

public static void main(String[] args)

{

ArrayList xa = new ArrayList();

xa.addAll(Arrays.asList("ASDASD", "B"));

List x = xa;

System.out.println(x.get(0));

}

但是在执行下面的代码时,只需将返回对象的类检索添加到前一个代码块就会引发类强制转换异常.如果上面的代码完美执行,则以下内容也应该执行而没有任何异常:

public static void main(String[] args)

{

ArrayList xa = new ArrayList();

xa.addAll(Arrays.asList("ASDASD", "B"));

List x = xa;

System.out.println(x.get(0).getClass());

}

为什么java在获取对象的类类型时执行类型转换?

解决方法:

编译器必须在必要时在字节代码级别插入类型检查指令,因此在分配给Object时,例如对象o = x.get(0);或System.out.println(x.get(0));,可能不需要它,调用表达式x.get(0)上的方法确实需要它.

原因在于binary compatibility rules.简单地说,调用方法是由接收器类型继承还是显式声明是无关紧要的,表达式x.get(0)的形式类型是Integer并且您正在调用方法getClass(因此,调用将被编码为一个名为getClass的方法的调用,并在接收器类java.lang.Integer上使用signature()→java.lang.Class.此方法从java.lang.Object继承并且在编译时声明为final的事实不会被编译的类反映出来.

所以从理论上讲,在运行时,可以从java.lang.Object中删除该方法,并将新方法java.lang.Class getClass()添加到java.lang.Integer,而不会破坏与该特定代码的兼容性.虽然我们知道这种情况永远不会发生,但编译器只是遵循正式规则而不是将有关继承的假设注入代码中.

由于调用将被编译为针对java.lang.Integer的调用,因此在调用指令之前必须进行类型转换,这将在堆污染方案中失败.

请注意,如果您将代码更改为

System.out.println(((Object)x.get(0)).getClass());

您将明确假设该方法已在java.lang.Object中声明.扩展到java.lang.Object将不会生成任何额外的字节代码指令,所有这些代码都会将方法调用的接收器类型更改为java.lang.Object,从而无需进行类型转换.

这里的规则有一个有趣的偏差,如果方法是java.lang.Object中声明的已知最终方法之一,编译器会将调用编码为在字节码级别上的java.lang.Object上的调用.这可能是由于这些特定方法are specified in the JLS以及以这种形式对它们进行编码的事实允许JVM快速识别这些特殊方法.但checkcast指令和invokevirtual指令的组合仍然表现出相同的兼容行为.

标签:java,java-8,classcastexception,unchecked-cast,raw-types

来源: https://codeday.me/bug/20190527/1163826.html

java raw types,java – 为Raw Types抛出不一致的ClassCastException相关推荐

  1. java 最后的异常_java – 最后不要抛出堆栈溢出异常

    Error不是例外.所以捕捉任何异常都不会捕获StackOverflowError. 所以让我们先来看一下"明显的错误" – (这段代码不太适合这个答案后面的说明): catch( ...

  2. java中的throw_java 中Throw能抛出的是什么?

    java 中Throw能抛出的是什么? A:ERROR B:Event 选D Error Exception 都是Throwable的子类 RunTimeException 是Exception的子类 ...

  3. java 非法参数异常_Java的比较抛出非法参数异常

    我得到这个错误:当我试图在Java中运行这个比较对我的实体系统Java的比较抛出非法参数异常 Exception in thread "Thread-3" java.lang.Il ...

  4. java 抛出403_java.io.IOException:服务器返回HTTP响应代码:403 [URL]

    参见英文答案 > 403 Forbidden with Java but not web browser?                                    4个 我的代码是 ...

  5. java 发送邮件553错误_使用Java Mail API发送邮件,抛出认证错误553 authentication is required. 解决办法...

    转载原文:https://blog.csdn.net/sun2015_07_24/article/details/52074898 在使用Java Mail API的过程中,抛出553 authent ...

  6. java中在方法体内抛出异常_Java异常处理中___用于方法体内,抛出一个异常对象。...

    Java异常处理中___用于方法体内,抛出一个异常对象. 答: throw; 智慧职教: 运输高致病性动物病原微生物菌(毒)种或者样本的,与内包装要求错误的是 答:E.主容器表面标注"高致病 ...

  7. Java提高篇——Java 异常处理

    异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用Syst ...

  8. Java 异常(Java Exception)(一)

    Java异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各 ...

  9. 深入理解Java类加载器:Java类加载原理解析

    http://blog.csdn.net/zhoudaxia/article/details/35824249 1 基本信息 每个开发人员对java.lang.ClassNotFoundExcetpi ...

最新文章

  1. 一键部署dns服务_OpenShift : 通往云原生、DevOps、微服务和Serverless的大门
  2. Apache理论与实战
  3. pythonpandas读取csv和另外一个csv进行比较_Python Pandas:比较一个列中类似值的两个csv(dataframe)的行,并返回相似的行(列)的内容...
  4. 从一个实际的例子来了解线程套间模型(.NET and COM interop)
  5. (有图片)汇编工具dosbox下自动mount及切换虚拟目录使用步骤。
  6. linux 下使用 tc 模拟网络延迟和丢包
  7. 智能客户端ios_为什么现在的客户端开发越来越不吃香了
  8. ROS仿真-记一次错误 gazebo-2 process has died exit code 2
  9. 一个简单的静态web服务器
  10. Linux 学习手记(5):使用Vim文本编辑器
  11. UVA160 Factors and Factorials【筛选法】
  12. 2019.2.2牛客寒假算法基础集训营
  13. matplotlib 柱状图、饼图;直方图、盒图
  14. 79.iOS 设备的UI规范和iOS各控件默认高度
  15. Unity UGUI-Canvas
  16. Word技巧:如何使用正则表达式高效替换
  17. bzoj1755 [Usaco2005 qua]Bank Interest
  18. 数据结构与算法实验6——图论 7-10 公路村村通
  19. docker容器里无法使用vi命令
  20. mk突变点检测_气候突变检测

热门文章

  1. 从硬盘安装在XP下装红旗linux双系统
  2. Linux系统下软件包管理六
  3. 木兰已出现,木兰已死?
  4. [扩展中国剩余定理(EXCRT)]
  5. SpringBoot2.1版本的个人应用开发框架 - 集成Druid + MybatisPlus
  6. 2017 ACM Jordanian Collegiate Programming Contest
  7. 每天五分钟linux(14)-head
  8. RocketMQ大数据畅想
  9. 读取gdb中的图层类型_ArcGIS读取gdb内要素
  10. rstudio python_Rstudio支持可视化的Markdown编辑了?