【发布时间】:2021-04-11 20:39:15
【问题描述】:
我不确定我的问题是否足够清楚,所以我会举例说明。假设我们有下一个表达式:
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 是一个 double,但为什么不能将其“降级”为 float 并强制我们将字面量声明为 float 12.0F?我知道这将代表信息的丢失。但是,将整数转换为短字节或字节也代表丢失了信息,不是吗?
最后,为什么我们可以将整型字面量赋给 short 或 byte 类型的变量...
short a = 10;
byte b = 12;
但我们不能将整数作为参数传递给需要短/字节参数的方法?
public void newMethod(short x, byte y){
...
}
。 . .
newMethod(10, 2)
如果您可以搜索一些我可以阅读此类内容的链接,那就太好了(因为我不确定如何搜索我遇到的这些特定问题)。
提前谢谢大家。
【问题讨论】:
-
编译器可以确定文字值在适当的范围内。一旦将值分配给
int类型的变量,它就无法再检查了。 -
@ElliottFrisch 所以你基本上是说,一旦我用一个变量包装一个文字,编译器就无法确定该文字的值是否超过(比如说)一个字节或一个短的范围?跨度>
-
@YuliyaSheludyakova 是的,它实际上澄清了几乎所有事情。我仍然不明白为什么不能将
int(例如10)类型的文字(不是变量)传递给需要byte、short或char参数的方法。 -
@DamianGDO 编译器非常好。但他们没有感觉。您不要用变量包装文字,而是为变量赋值。
int a = 100;将100分配给a。合法的。byte b = a;- 将变量a(int)中的值分配给byteb- 编译器不会假定这是一个有效的赋值(除非你告诉它)。byte b = (byte) a;(嘿,我是开发人员。我知道这很安全)。
标签: java variables type-conversion literals type-promotion