Java 中的文字和变量的数字提升和降级如何工作?

问题描述

我不确定我的问题是否足够清楚,所以我会举例说明。让我们认为我们有下一个表达式:

byte byteNumber = 10 * 10;

我理解文字10 认情况下是一个整数,所以表达式 10 * 10 也会产生一个整数,但是 Java 将它“降级”为一个字节值,因为变量(其中结果存储)是一个字节。

但是,为什么这会有所不同?

int x = 10;
int y = 10;

byte byteNumber = x * y;

行字节 byteNumber = x * y;标记错误。我理解表达式 x * y 产生一个整数,但不像文字那样“降级”。即使只有一个变量,如 x * 10,结果也不会降级。为什么?我相信这与变量类型有关,但认情况下文字是整数,它们可以“降级”。

一个我正在苦苦挣扎的例子是:我们可以将整数文字赋值给 byte、short 或 char 类型的变量,Java 会自动将整数转换为我们声明的变量类型,例如:

short a = 10;
byte b = 12;

另一方面,为什么我们不能做这样的事情?

float c = 12.0;

是的,12.0一个双精度值,但为什么不能将它“降级”为浮点数并强制我们将文字声明为浮点数 12.0F?我知道这将代表信息丢失。但是,将整数转换为 short 或 byte 也代表信息丢失,不是吗?

最后,为什么我们可以将整数文字分配给类型为 short 或 byte 的变量...

 short a = 10;
 byte b = 12;

但是我们不能将整数作为参数传递给需要短/字节参数的方法

public void newMethod(short x,byte y){
    ...
}

。 . .

newMethod(10,2)

如果您能搜索一些我可以阅读此类内容链接,那就太好了(因为我不确定如何搜索我遇​​到的这些具体问题)。

先谢谢大家。

解决方法

您可以查看以下两个链接:

顺便说一下,#1 StackOverflow 贡献者 Jon Skeet 回答了这两个问题 :)