当前位置: 首页 > 知识库问答 >
问题:

包装和自动装箱

步兴德
2023-03-14

有以下代码:

Integer time = 12;
Double lateTime = 12.30;
Boolean late = false;
Double result = late ? lateTime : time;  //Why here can I assign an Integer to a Double?
System.out.println(result);

它打印:

12

这个不能编译。为什么?

Integer time = 12;
Double lateTime = 12.30;
Double result = time;      //Integer cannot be converted to Double
System.out.println(result);

共有1个答案

鲁展
2023-03-14

这些差异是由于Java中的三元运算符行为造成的。

三元条件大小写:

在表达式中,迟到了吗?lateTime:time,Java将自动将一个参数(根据late的值)精确地取消装箱到其各自的基元类型。(您可以通过将time设置为nulllate设置为true来观察这一点:不会抛出NullPointerException。当将lastTime设置为nulllate设置为false时,同样适用)

如果表达式的值将是时间,则该值将扩大为双精度

在这两种情况下,生成的double在分配给result时自动装箱到double

简单的赋值案例:

写入<代码>双结果=时间 ,Java不允许这样做,因为它希望您更加明确。

就我个人而言,我发现Java三元条件运算符关于装箱原语类型的机制是语言中最有害的部分之一

 类似资料:
  • 本文向大家介绍自动装箱和拆箱?相关面试题,主要包含被问及自动装箱和拆箱?时的应答技巧和注意事项,需要的朋友参考一下 自动装箱是Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。 比如:把int转化成 Integer,double转化成 Double,等等。反之就是自动拆箱。 原始类型: boolean,char,byte,short,int,long,float,double 

  • 如果我有一个泛型参数,我通过模式匹配到基元(如 )来解析该参数,那么自动装箱是否比使用自定义包装器类型便宜?例如 对抗 第一种方法是否提供任何性能优势?如果该方法使用代替,这种情况是否相同: ?

  • 主要内容:装箱和拆箱,包装类的应用在 Java 的设计中提倡一种思想,即一切皆对象。但是从数据类型的划分中,我们知道 Java 中的数据类型分为基本数据类型和引用数据类型,但是基本数据类型怎么能够称为对象呢?于是 Java 为每种基本数据类型分别设计了对应的类,称之为 包装类(Wrapper Classes),也有地方称为外覆类或数据类型类。 包装类和基本数据类型的关系如下表所示。 基本数据类型及对应的包装类 序号 基本数据类型

  • 问题内容: 为什么第二段代码更快? 问题答案: 自动装箱使用,内部将Integer对象缓存为小整数(默认情况下为-128至127,但是最大值可以使用“ java.lang.Integer.IntegerCache.high”属性进行配置-请参见Integer.valueOf的源代码) ,因此与直接调用不同。因为在调用之前可以快速检查整数值的大小,所以直接调用要快一些(尽管如果您有很多小整数,它会使

  • 主要内容:Spring 自动装配,自动装配规则,示例我们把 Spring 在 Bean 与 Bean 之间建立依赖关系的行为称为“装配”。 Spring 的 IOC 容器虽然功能强大,但它本身不过只是一个空壳而已,它自己并不能独自完成装配工作。需要我们主动将 Bean 放进去,并告诉它 Bean 和 Bean 之间的依赖关系,它才能按照我们的要求完成装配工作。 在前面的学习中,我们都是在 XML 配置中通过 <constructor-arg>和 <

  • 根据我的理解,Java函数指针或lambda,您声明的签名如下所示 为了应用它,我们使用 这里涉及自动装箱吗?如果是,如何避免它(并且仍然有类似于fkt-pointers的东西?) 我知道自动装箱可能是一个性能问题,因为它每次都创建一个对象(而不是堆栈上的一个原语)。如果它隐式地发生,这可能会令人沮丧,所以我问;)