gpt4 book ai didi

java - 为什么我可以将整数文字分配给短类型变量而不是短类型方法参数?

转载 作者:太空狗 更新时间:2023-10-29 22:57:01 25 4
gpt4 key购买 nike

为什么我可以这样做:

short a = 5;

但不是这个:

void setNum(short a);

setNum(5);

它抛出:

Possible lossy conversion from int to short

我知道 5 是一个整型字面量,您必须对其进行转换。我也明白,如果该值不是常量,那么很明显它需要抛出该错误,因为该值可能达到短类型的限制。但是,如果编译器知道我正在传递一个 short 可以容纳的常量(如在赋值中),为什么它不让它编译呢?我的意思是,它们之间有什么区别?

最佳答案

为了理解为什么赋值类型转换有效而调用被拒绝,必须引用 Java 语言规范主题以了解 narrowing primitive conversions以及该转换的上下文:assignment contextinvocation context .

根据 JLS,如果满足以下条件,则在赋值上下文中允许缩小原语转换:

A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.

...当分配给 short a 时,它与您的情况匹配 int 常量 5

调用上下文中不允许这样的缩小原始转换,这解释了为什么在传递 int 时对 setNum(short) 的调用失败> 常量 5

But why if the compiler knows I'm passing a constant that a short can hold (as in the assignment) it doesn't let it compile? I mean, what is the difference between them?

JLS 一定不想给编译器增加这种额外逻辑的负担。在调用情况下,与形式参数类型匹配的参数是一个表达式——编译器已经确定了类型,但不需要检查表达式的值是否也可以安全地缩小。在这种情况下,作为常量,我们 很清楚它可以,但在执行上下文中,允许编译器不理会该检查,实际上禁止它是正确的。

应该相当清楚,当允许使用表达式时,错误会更容易潜入无法在不损失精度的情况下进行缩小的地方,因此 JLS 和编译器在所有情况下都不允许这样做。

numeric context也是如此,所以声明:

short a = 5;short b = a * 5;

... 同样是不允许的,尽管显然由正确缩小的常量组成。

关于java - 为什么我可以将整数文字分配给短类型变量而不是短类型方法参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39886332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com