java - 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
导致编译时错误。
有人可以解释驱动这一点的基本逻辑吗?
解决方案
实际原因比其他一些答案所暗示的要复杂一些。
JLS 5.2声明了以下关于赋值上下文中允许的转换。
此外,如果表达式是 、 、 或 类型的常量表达式(第
byte
15.28short
节char
)int
:
如果变量的类型为 、 或 ,并且常量表达式的值可以用变量的类型表示,则可以使用缩小原
byte
语short
转换char
。
Byte
如果变量的类型为 ,Short
或Character
,并且常量表达式的值可分别表示为 ,或类型byte
,则可以使用紧缩原语转换后跟装箱转换。short
char
声明/初始化
byte byteVar = 100; // OK
之所以有效,是因为满足所有先决条件:
100
是一个常量表达式- 它的类型是
int
- 它的值在范围内
byte
;即它可以表示为byte
- 它被分配给一个
byte
变量。
声明/初始化
byte byteVar = 100L; // FAIL
失败是因为类型100L
是long
而不是int
。
推荐阅读
- django - 如何在 Django 中使用 Vue 模板?
- mysql - 用于 AJAX 网页的 Linux Web 服务器配置高消耗 CPU
- api - Twitter can_dm 在 Web API 上返回 null
- python-3.x - 使用 Python 3 通过 WIFI 将相机从一个 Raspberry Pi 播放到另一个
- javascript - 子组件没有设置从父组件传来的初始值:ReactJS
- excel - 如何在删除最后一个字符的同时复制数组并以双精度获得结果
- javascript - showDialogPopup 点击后刷新页面
- python - 关于 tensorflow 中的反向传播深度神经网络
- batch-file - 为什么输出中缺少命令 FOR 的 /D 选项中的字母 D?
- javascript - 如何将js小部件转换为amp组件