当前位置: 首页 > 面试题库 >

包装器类-为什么整数文字对Long失败,但对更小的东西起作用

龚宏壮
2023-03-14
问题内容

只是想了解自动装箱,除了一件事情,我还要做:

Short s = 250;
Long l = 250;

分配给Long l失败。我希望这是因为您不能扩大然后装箱(即,它试图将int值扩大250到a long,然后装箱它不能这样做)。

但是,分配Short s工作。是怎么回事使这一切呢?我的假设是它仍在进行拳击和某种转换。但是,如果是这样的情况,那就知道250适合一个short,为什么不知道250适合一个long呢?


问题答案:

通常,您不能在分配中应用多个(隐式)转换(JLS§5.2分配转换):

将表达式的值(第15.26节)分配给变量时,将发生赋值转换:必须将表达式的类型转换为变量的类型。分配上下文允许使用 以下之一

  • 身份转换(第5.1.1节)
  • 不断扩大的原始转换(第5.1.2节)
  • 扩展参考转换(第5.1.5节)
  • 装箱转换(第5.1.7节)(可选),然后进行扩大的参考转换
  • 取消装箱转换(第5.1.8节),然后可以选择加宽原始转换。

Long l=250; 需要两次转换(先扩大原始转换再进行装箱转换),这就是为什么它不编译的原因。

Long l=250l; 进行编译,因为它需要一次装箱转换。

但是缩小常量表达式的转换是一个特例,这就是为什么要Short s=250;编译:

此外,如果该表达式是类型为byte,short,char或int的常量表达式(第15.28节):

  • 如果变量的类型为byte,short或char,并且常量表达式的值可表示为变量的类型,则可以使用缩窄的原始转换。
  • 如果变量的类型为:可以使用紧缩原始转换后跟装箱转换。
    • 字节和常量表达式的值可以在类型字节中表示。
    • 短,常量表达式的值可以用短类型表示。
    • 字符和常量表达式的值可以用char类型表示。



 类似资料:
  • null 只使用数据类型有什么特别的缺点吗? 使用数据类型代替数据类型有意义吗?

  • 我已经看到变量的原始版本和对象版本之间有以下映射: 浮- 所以,对他们所有人来说,唯一的区别就是世界上的第一个字母。我想知道为什么这个规则不适用于变成整数(而不是int)的int和变成字符而不是(char)的char。 我不知道这是否是问这个问题的正确地方,但我真的很想知道这个选择是否有原因,即使因为我教孩子们java,他们也经常问我同样的问题。

  • 问题内容: 我正在查看一些代码,并遇到了一个实例,该实例后增加了一个成员变量,该成员变量是Integer的包装器类。我自己尝试过,真的很惊讶它起作用。 这会打印出来,而不是 我期望的那样。我已经浏览了语言规范,但找不到任何相关内容。谁能向我解释为何有效,以及在多个平台上是否安全?我以为这会分解成 但是很显然,规范中有些内容使其添加到最后一行之前 问题答案: 跨平台使用绝对安全。该行为在Java语言

  • 问题内容: 为什么我的代码不起作用? 结果是:0 1 2 3 4 5 6 7 8 9。 我期待一个 随机改组的序列 。 问题答案: 不能按预期应用于原始类型的数组。当应用于时,将产生的列表,而不是的列表。因此,您将重新整理一个新创建的列表。 这是Java中可变参数和泛型的微妙行为。被声明为 因此,它可以采用某些类型的多个参数并生成包含这些参数的列表,也可以采用一个类型的参数并返回此数组支持的列表(

  • 关于如何修复gradle版本,有很多很好的建议,但有些已经过时了,或者我只是找不到建议的路径。对我来说,一个解决方案是Project>Project Structure>Project>Gradle Version。 在这里我可以把它改成支持的版本,并且成功地构建项目。 从这个链接,它暗示这是设置你的gradle包装的方式。 因此,我希望Project/Platforms/Android/Grad

  • 我在dto类型的对象上设置了一个注释集,与在实体类型的对象上设置的注释集相同。注释对实体起作用,但对DTO类型的对象不起作用。 我在Springboot工作。Application.Properties 我需要能够获得在dto对象的字段上设置的约束注释,或者更确切地说是它的参数(但是在dto对象的情况下,我获得null,因为Spring可能不知道如何使用在dto对象的字段上设置的约束注释),在实体