【问题标题】:What exactly is narrowing type conversion in java? [duplicate]什么是缩小java中的类型转换? [复制]
【发布时间】:2014-05-30 07:19:27
【问题描述】:

根据我在 Java 方面的知识,如果源中的任何常量的字节范围超过以下范围,则在缩小类型转换时:

byte b=10; // allowed because 10 is in range of byte and 10 is a constant

但是当我输入这个时:

byte b=10l; // this is not allowed although 10 is in range of byte and is a constant 

为什么会这样? 能否请您说出这些缩小转换在 Java 中发生的确切规则。

【问题讨论】:

标签: java narrowing


【解决方案1】:

技术上的答案是——因为规范是这样说的。 §5.2 "Assignment Contexts" of The Java Language Specification, Java SE 8 Edition,部分声明:

此外,如果表达式 [在赋值语句的右侧] 是 byteshortcharint 类型的常量表达式(第 15.28 节):

  • 如果变量的类型是byteshortchar,并且常量表达式的值可以用变量的类型表示,则可以使用缩小原语转换。

至于为什么它不允许常量表达式为long 类型,我想是你永远不会“意外”以long 类型结束。能够将byte b = 127 写为byte b = (byte) 127 的简写,同时让编译器防止您错误地将byte b = 128 写为byte b = (byte) 128 的简写,这是非常方便的;能够写byte b = 127L 并不是那么有用,具体来说,因为你为什么需要它?

【讨论】:

    【解决方案2】:

    http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.2:

    另外,如果表达式是一个常量表达式(§15.28) 键入 byte、short、char 或 int

    • 如果变量的类型是 byte、short 或 char,并且常量的值是 表达式可以用变量的类型来表示。

    您有一个 long 类型的常量表达式,并且在这种情况下不能应用缩小原始转换。

    所以你可以这样做:

    • byte b = 10
    • byte b = (int) 10
    • char b = (short) 10
    • byte b = (char) 10L
    • short b = (int) 10L

    但你不能这样做:

    • byte b = 10L
    • byte b = (long) 10

    【讨论】:

      【解决方案3】:

      因为您附加到 value 的 l 明确告诉编译器 - “听着兄弟。我在这里有一个 'long' 字段。给它一个 'long' 字段所需的空间”。

      很明显,长值不能放入字节字段中。 所以,你得到了错误 - Cannot Convert from Long to Byte

      【讨论】:

      • 但是在 byte b=10 中,10 会被当作 int 处理,它的大小是 byte 大小的 4 倍。那么,你的论点在这种情况下也应该是正确的。
      • @VikasMangal “缩小原语转换”仅适用于 int(不是 long)编译时常量值。
      • 请注意,“字段”在 Java 中具有技术意义(它指的是成员变量),因此您可能需要选择不同的术语。
      【解决方案4】:

      Java 是一种强类型语言。它隐式地处理从较小类型到较大类型的类型转换,但在从较大类型到较小类型的类型转换的情况下,您需要通过类型转换显式地进行。

      例如,long 可以容纳 int,但 int 没有足够的空间容纳 long,因此编译器会警告您。

      所以在你的情况下你可以这样做:

      byte b= (byte) 10l;
      

      希望对你有帮助

      【讨论】:

      • 你也可以做到byte b = (int) 10lintbyte“大”。
      【解决方案5】:

      你是对的,10 在字节范围内。但是当你使用带有常量的l 后缀时,java 理解它这个常量是long。因为long 不能放入byte,所以你会得到一个错误:javac 说的可能精度损失。

      但是,byte b = (byte) 10l; 有效,因为它是从longbyte 的直接转换。

      【讨论】:

      • 在 java 中,每个字面量整数都可以是 byteshortintlong 类型。默认情况下,Java 尝试将整数分配给变量,假设整数适合变量的类型大小。如果它不适合,编译器会引发错误。当你写byte b = 10 时,这很好,因为 10 适合字节并被视为字节。但是,如果你尝试byte b = 130,你会得到同样的错误,因为 130 不在byte 范围内。
      猜你喜欢
      • 1970-01-01
      • 2021-03-16
      • 2011-12-28
      • 1970-01-01
      • 2015-12-22
      • 2016-04-02
      • 2019-08-10
      • 2018-04-22
      • 1970-01-01
      相关资源
      最近更新 更多