Java自动拆箱陷阱。 谨防!

您认为以下代码段会显示什么?

Object o = true ? new Integer(1) : new Double(2.0);
System.out.println(o);

是! 它将打印:

1.0

什么? 1.0? 但是我已经为我的o变量分配了一个Integer 。 为什么打印1.0? 事实证明,JLS的§15.25中有一个微妙的小规范部分,它指定了三元运算符。 以下是适用于以上内容的内容:

条件表达式的类型确定如下:

  • […]
  • 否则,如果第二个和第三个操作数具有可转换为数字类型(第5.1.8节 )的类型,则有以下几种情况:
    • […]

二进制数值提升可能会隐式执行拆箱转换! ek! 谁会想到这个? 您可以从自动拆箱中获取NullPointerException,如果其中一个操作数为null ,则以下操作将失败

Integer i = new Integer(1);
if (i.equals(1))i = null;
Double d = new Double(2.0);
Object o = true ? i : d; // NullPointerException!
System.out.println(o);

显然(显然!!),可以通过将数字类型转换为非数字类型来规避此问题,例如Object

Object o1 = true ? (Object) new Integer(1) : new Double(2.0);
System.out.println(o1);

上面将打印

1

保罗·米纳(Paul Miner)是发现这一难题的功劳,他在reddit上对此进行了更详细的解释。

参考: Java自动拆箱陷阱。 谨防! 从我们的JCG合作伙伴 Lukas Eder在JAVA,SQL和JOOQ博客中获得。

翻译自: https://www.javacodegeeks.com/2013/10/java-auto-unboxing-gotcha-beware.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang学习笔记(6)--面向接口编程

一、 duck typing duck typing意思是鸭子类型,我们把具备鸭子的行为等部分特征的一个东西叫做鸭子,这是鸭子类型的解释。其实,在go语言中是采用鸭子类型这种思想来实现接口这种编程方式的,我们把一个类只要实现了某接口的方法&…

c语言self用法,C/C++知识点之Self Numbers C语言 UVA640

本文主要向大家介绍了C/C知识点之Self Numbers C语言 UVA640,通过具体的内容向大家展示,希望对大家学习C/C知识点有所帮助。In 1949 the Indian mathematician D.R. Kaprekar discovered a class ofnumbers called self-numbers. For any positive integ…

JS 的平凡之路--学习人气眼中的效果(上)

最近看了看人气眼的界面,感觉到学习的地方有很多呀。这里先带大家看看人气值跳动的实现。本篇代码基于Vue2.x.x。 一、概要 首先看一下效果图: 要想实现上面的效果,我们分为这几个部分: 判断元素是否在可视区域内;函数…

[Swift]LeetCode86. 分隔链表 | Partition List

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址&a…

XmlNode与XmlElement的区别总结

原文链接:http://www.cnblogs.com/oilsun/archive/2012/07/07/2580427.html 今 天在做ASP.NET操作XML文档的过程中,发现了两个类:XmlNode和XmlElement。这两个类的功能极其类似(因为我们一般都是在对 Element节点进行操作&#xf…

HOW TO:构造Java类

在这篇HowTo帖子中,我将展示如何将一个类与另一个类一起定型。 为什么这有用? 当您的项目中发生大量BCI时,让每个开发人员编写BCI代码都是不明智的。 首先,这不会抽象出所使用的BCI库。 鉴于Java不支持多重继承,构造型…

android horizontalscrollview 动画,Android HorizontalScrollView左右滑动效果

本文实例为大家分享了Android HorizontalScrollView左右滑动的具体代码,供大家参考,具体内容如下效果图一.什么是HorizontalScrollViewHorizontalScrollView实际上是一个FrameLayout ,这意味着你只能在它下面放置一个子控件 ,这个子控件可以包…

[译] Airbnb 在 React Native 上下的赌注(一):概述

原文地址:React Native at Airbnb原文作者:Gabriel Peal译文出自:掘金翻译计划本文永久链接:https://github.com/xitu/gold-miner/blob/master/TODO1/react-native-at-airbnb.md译者:ALVINYEH校对者:ChenDo…

noip退役之路--祝福

原文地址:bb机的老巢 文/鲁迅 noip前的集训毕竟最像集训,去北京不必说,就在自己学校的机房中也显出将到noip的气象来。屏幕广播里讲解的题目闪着斑白的微光,随着鼠标叩击“提交”按钮的一声钝响,是直播ac后的欢呼&…

批处理最佳做法

大多数应用程序至少具有一个批处理任务,在后台执行特定的逻辑。 编写批处理作业并不复杂,但是您需要了解一些基本规则,我将列举一些我发现最重要的规则。 从输入类型的角度来看,处理项目可以通过轮询处理项目存储库来实现&#x…

android 360度视频播放器,Android开发VR实战之播放360度全景视频

VR即Virtual Reality虚拟现实。虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统它利用计算机生成一种模拟环境是一种多源信息融合的交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中。那么,如何在Android中去开发VR功能的APP呢&#xff1f…

关于怎么在手机端实现一个拖拽的操作

手机端&#xff0c;肯定是监听touchstart,touchmove,touchend事件 先来看看效果 当拖拽时&#xff0c;拖拽到哪个节点下面&#xff0c;就把哪个节点添加到这个下面 <div>1111</div><div>2222</div><div>3333</div><div>4444</div…

二叉树的前序创建

1 #include <stdio.h>2 #define ElemType char3 //节点声明&#xff0c;数据域、左孩子指针、右孩子指针4 typedef struct BiTNode{5 char data;6 struct BiTNode *lchild,*rchild;7 }BiTNode,*BiTree;8 //先序建立二叉树9 BiTree CreateBiTree(){ 10 char c…

Apache Karaf遇到Apache HBase

介绍 Apache HBase是模仿Google Bigtable的开源&#xff0c;分布式&#xff0c;版本化&#xff0c;面向列的商店。 如果您是普通读者&#xff0c;那么您可能已经知道Apache Karaf是什么&#xff0c;但是对于那些不是的读者&#xff1a;Apache Karaf是一个OSGi运行时&#xff0c…

物联网架构成长之路(24)-Docker练习之Compose容器编排

0.前言  一开始学的之后&#xff0c;是想一步到位直接上Kubernetes(K8s)的&#xff0c;后面没想到&#xff0c;好像有点复杂&#xff0c;有些概念不是很懂。因此学习东西还是要循序渐进&#xff0c;慢慢来。先了解单机编排技术Docker Compose&#xff0c;了解一些技术细节及原…

CSS原理解析之模型篇

写在前面&#xff1a;尝试回答几个问题&#xff1a;什么是盒模型&#xff0c;控制盒模型的属性有哪些&#xff1f;Margin、Padding、Border、Width、Height这些属性改变/影响盒模型&#xff0c;但每个属性都会在所有元素上生效么&#xff1f;如果存在区别&#xff0c;那么和元素…

Quartz遇到的问题

本文首次发布于My Blog,作者张琦(Ian),转载请保留原文链接。 有状态和无状态 使用有状态&#xff08;StatefulJob&#xff09;还是无状态的任务&#xff08;Job&#xff09; 在 Quartz 中&#xff0c;基本来说&#xff0c;任务分为有状态和无状态两种。实现 Job 接口的任务缺省…

android baseactivity,Android应用开发Android通过BaseActivity获取到当前启动的Activity名称...

本文将带你了解Android应用开发Android通过BaseActivity获取到当前启动的Activity名称&#xff0c;希望本文对大家学Android有所帮助。<在BaseActivity的onCreate方法中:public class BaseActivity extends AppCompatActivity { Override protected void onCreate(Nul…

RIP RETE时间获得PHREAKY

我刚刚完成了我称为PHREAK的新规则算法的一些高级文档&#xff0c;这是混合推理中的一个文字游戏。 它仍然有点粗糙和高水平&#xff0c;但希望仍然很有趣。 它建立在ReteOO之上&#xff0c;非常好阅读。 ReteOO算法 ReteOO是在3、4和5系列发行版中开发的。 它采用RETE算法并应…

Hadoop自学笔记(三)MapReduce简单介绍

1. MapReduce Architecture MapReduce是一套可编程的框架&#xff0c;大部分MapReduce的工作都能够用Pig或者Hive完毕。可是还是要了解MapReduce本身是怎样工作的&#xff0c;由于这才是Hadoop的核心&#xff0c;而且能够为以后优化和自己写做准备。 Job Client, 就是用户 Job …