【问题标题】:Assigning result of Integer.parseInt to char primitive将 Integer.parseInt 的结果分配给 char 原语
【发布时间】:2018-12-23 13:00:49
【问题描述】:

声明

char c = 10;

编译正常,但是

char d = Integer.parseInt("10");

导致编译错误

“类型不匹配无法从 int 转换为 char”。

这两种说法有什么区别?

【问题讨论】:

    标签: java char


    【解决方案1】:

    这在 Java 语言规范第 5.2 节分配上下文中有记录:

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

    • 如果变量的类型是byteshortchar,并且常量表达式的值是 可以用变量的类型来表示。

    10是一个常量表达式,char可以表示10(char可以存储0~65535),所以intchar的转换是允许的。 Integer.parseInt("10") 不是一个常量表达式(它必须在运行时计算),所以这里不允许从 intchar 的转换。

    【讨论】:

      【解决方案2】:

      int 不是char。它们是java中的两种不同的原始类型。 int 是32bit,char 是8bit

      当你这样做时

      char d = Integer.parseInt("10");
      

      您正在将 string "10" 解析为 int,然后您尝试将其分配给 char,除非您明确指定向下转换,否则该字符将不起作用。由于精度下降,编译器会抱怨并要求您明确地向下转换它。如下图所示:

      char d = (char) Integer.parseInt("10");
      

      在第一个语句中,

      char c = 10;
      

      值 10 在char 的范围内。范围从 (0 - 65,536) 无符号,所以没有问题。假设该值大于此值,您会遇到同样的问题。

      【讨论】:

      • 你可能会提到编译器可以检查文字的大小写,所以它实际上会抱怨char c = 12334567; 因为无法确定任意的int,它总是抱怨。跨度>
      【解决方案3】:

      在 JLS 5.2 部分:

      赋值上下文允许将表达式的值(第 15.26 节)赋值给变量

      如果表达式是字节类型的常量表达式(第 15.28 节), 短、​​char 或 int:
      • 如果满足以下条件,则可以使用缩小基元转换 变量的类型是 byte、short 或 char 常量表达式可以用变量的类型来表示

      什么是constant expression

      常量表达式是表示原始值的表达式 type 或一个不会突然完成并使用 只有以下...

      所以,恕我直言, 在char c=10; 中,将int 类型的constant expression 分配给char 类型的变量,并且narrowing primiteve conversion 正在发生。

      虽然在char d= Integer.parseInt("10"); 中,Integer.parseInt() 返回了一个int 值,该值具有32 位,并且它将超过char 类型的16 位限制,因此它会抱怨它并要求明确的沮丧。

      【讨论】:

        【解决方案4】:

        首先,请注意int 的容量比char 大得多。

        1. 您的第一个示例可以编译,因为编译器仅在 100% 确定转换会成功时才允许进行隐式转换;编译器知道从intchar10 会成功。另一方面,说它是char c=101111; 不编译...

        2. 您的第二个示例无法编译,因为 Integer.parseInt("10") 在运行时生成值,编译器无法确定将分配给 d 的值,因此需要显式转换才能编译。

        【讨论】:

          【解决方案5】:

          在第一个中,您将字符值10 分配给字符。如果您打印该字符,它将打印一个新行。因为换行符的字符值为10

          但是在第二个中,您试图将 Integer Object 分配给 char,这是不可能的。您只能为 char 分配一个真实字符或字符值

          举个例子

          char c='A';
          char c=65;
          

          这两个都会打印A,因为A的字符值是65

          更多信息请参考link

          【讨论】:

            【解决方案6】:

            在此我们将一个字符串转换为一个 int,然后尝试将该 Integer 分配给一个字符。这就是它导致错误的原因

            char d = Integer.parseInt("10");

            要消除错误,您需要将其类型转换为 char 即

            char d=(char)Integer.parseInt("10");

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-08-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-10-21
              • 1970-01-01
              • 1970-01-01
              • 2012-12-10
              相关资源
              最近更新 更多