【问题标题】:Java compile time error in case of casting强制转换时的 Java 编译时错误
【发布时间】:2012-08-25 13:03:25
【问题描述】:

下面的代码给了我编译时错误Type mismatch: cannot convert from int to byte

int i = 10;
byte b = i;

但下面没有

 final int i = 10;
 byte b = i;

我不明白为什么编译器会在 final 的情况下表现出来?

【问题讨论】:

  • 你确定吗?它没有给我任何错误。发布错误消息。
  • 第一个代码 sn-p 给出编译时错误。类型不匹配:无法从 int 转换为字节,但第二个没有
  • 如果您尝试使用final int i = 128;,它将无法工作,因为它不再适合字节。
  • @anand:我以为你在抱怨第二次 sn-p。对此感到抱歉。

标签: java


【解决方案1】:

我认为这是因为 10 适合一个字节,但如果整数需要超过 8 位,那么它将无法再正确地执行此分配。

编辑

澄清一下,将其设为 final 是允许编译器将 int 视为常量,以便它可以进行常量折叠。它可能会阻止使用非最终 int 进行分配,因为它在编译时不知道该值,并且它可能比一个字节可以容纳的值大得多。

【讨论】:

  • 好吧,final 会向编译器表明 i 被声明为 10 并且应该始终为 10,并且在某些时候不会导致某个字节太大。跨度>
  • 忽略我的评论。我完全误解了这个问题。
【解决方案2】:

案例 1:编译错误,因为 int 可能不适合 byte;需要明确的演员表
情况2:编译器将第二条语句编译为byte b = 10;(因为ifinal),所以没有错误

【讨论】:

  • 我不明白为什么编译器将第二条语句编译为字节 b =10
  • 因为您将其声明为“final”,这意味着代码中的任何位置都不会更改值,因此编译器可以进行一些优化并将其视为常量值。由于在编译时知道该值不大于一个字节,因此它可以让您进行赋值。
  • i 是最终的,这意味着它的值永远不会改变。因此,编译器所做的一个明显优化是将其值内联到对它的每个引用,例如byte b = 10。如果将 i 的值更改为 128(即仅超出字节范围的 1 个值),那么您还应该看到编译错误。
【解决方案3】:

试试这个

int i=45;
final int j=i;
byte b=j;

比较一下

final int j=56;
byte b=j;

这将让您了解 int 到 byte 的隐式缩小是如何发生的,即只有当分配的值是常量表达式时才会发生

【讨论】:

    【解决方案4】:

    我不明白为什么编译器将第二条语句编译为字节 b =10 – anand

    那是因为,您正在指示编译器变量“i”将始终保持“10”作为值。因此,无论在何处引用,编译器都会将“i”替换为“10”。这样一来,JVM的工作就更容易了!

    【讨论】:

      【解决方案5】:

      案例一:

      int i = 10;
      byte b = i;
      

      int 原始类型值的范围可以从-2,147,483,648 [-231] 又名Integer.MIN_VALUE+2,147,483,647 [2 31-1] 又名Integer.MAX_VALUE

      int i= 10 表示编译器假定 int 的值可以从 -2,147,483,648 [-231] 到 +2,147,483,647 [2 31-1] 范围内,但 byte 不能保存此值。因此编译器给出了错误。

      案例 2:

      final int i = 10;
      byte b = i;
      

      这里 int 变量声明为 final 并初始化为 10。byte 可以保存 -128 到 127 之间的值,并且不会在 out 程序中更改。因为这个原因编译器没有给出任何错误。

      如果你用 128 声明同一个变量,它会报错。 例如:

      final int i = 128;
      byte b = i;
      

      【讨论】:

        猜你喜欢
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 2013-10-16
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        相关资源
        最近更新 更多