首页 > 解决方案 > byte byteVar = 100 有效,但 int intVar = 100L 会导致编译错误。为什么?

问题描述

只要文字的值在 byte/short 的范围内,整数文字就可以分配给 byte 或 short 变量。

但是当 long literal 赋值给 int 变量时,即使 long literal 的值在 int 的范围内,也会报编译错误

解释这个的逻辑是什么?

例子,

下面的行编译成功

byte byteVar =  100;   //works, here 100 is integer literal.

int intVar = 100L;   // fails, here 100L is long literal

导致编译时错误。

有人可以解释驱动这一点的基本逻辑吗?

标签: java

解决方案


实际原因比其他一些答案所暗示的要复杂一些。

JLS 5.2声明了以下关于赋值上下文中允许的转换。

此外,如果表达式是 、 、 或 类型的常量表达式(第byte15.28shortcharint

  • 如果变量的类型为 、 或 ,并且常量表达式的值可以用变量的类型表示,则可以使用缩小原byteshort转换char

  • Byte如果变量的类型为 ,ShortCharacter,并且常量表达式的值可分别表示为 ,或类型byte,则可以使用紧缩原语转换后跟装箱转换。shortchar

声明/初始化

byte byteVar =  100;  // OK

之所以有效,是因为满足所有先决条件:

  • 100是一个常量表达式
  • 它的类型是int
  • 它的值在范围内byte;即它可以表示为byte
  • 它被分配给一个byte变量。

声明/初始化

byte byteVar =  100L;  // FAIL

失败是因为类型100Llong而不是int


推荐阅读