- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
为什么我可以这样做:
short a = 5;
但不是这个:
void setNum(short a);
setNum(5);
它抛出:
Possible lossy conversion from int to short
我知道 5 是一个整型字面量,您必须对其进行转换。我也明白,如果该值不是常量,那么很明显它需要抛出该错误,因为该值可能达到短类型的限制。但是,如果编译器知道我正在传递一个 short 可以容纳的常量(如在赋值中),为什么它不让它编译呢?我的意思是,它们之间有什么区别?
最佳答案
为了理解为什么赋值类型转换有效而调用被拒绝,必须引用 Java 语言规范主题以了解 narrowing primitive conversions以及该转换的上下文:assignment context和 invocation 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/
由于 typescript 现在支持条件类型,我决定进行一些元编程,为 VSCODE intellisense 添加更多 flavor 。但是,虽然使用 A extends B 可以轻松分离其他类型,
我有一个 php var,它在回显时将 JS 函数写入页面的源代码。该函数循环遍历 CSV,因此其中包含以下行: $str="var lines = data.split('\n');"; 目前,当回
我有以下代码: name= "a"; value="b" $.post("ajax.php", {name:value}).... 然而 ajax.php 将收到 name=b 而不是 a=b。 我如
以下情况: var myVehicle = { brand: 'Tesla' }; var isMoving = Symbol(); var currentStatus = Symbol(); myV
我正在为 Python 翻译器编写 JavaScript,“\8”和“\9”给我带来了很多问题。根据文档,像“\8”或“\9”这样的东西是非法的,因为它们不是有效的八进制转义符。 Esprima pa
我有一个简单的 LinearLayout。当我将 android:background 添加到 LinearLayout 时,TextView 不再可见。 我不明白什么?
在尝试获得某种效果时遇到困难: 我有一张图片。我想将鼠标悬停在它上面。它应该变黑并弹出一些文本。 例子^ 执行此操作最简单/最简单的设置是什么?最好只有 HTML 和 CSS 注意:该元素需要在 CS
考虑以下代码: #include void f(const char * str) { str = "java"; } void main (int argc, char * argv[])
我想在 MySQL 中插入一条具有非 ASCII Unicode 字符的记录,但我在一个不允许我轻松键入非 ASCII 字符的终端上。如何在 MySQL 的 SQL 语法中转义 Unicode 文字?
Perl脚本batchReplace.pl可以用来批量替换文件中的文字/代码。可在指定目录中查找指定类型的文件,并递归检查子目录;在输出文件时复制输入文件的目录结构。 [附件]Win32应用程序b
我知道从 flutter 应用程序共享的官方包。 https://pub.dartlang.org/packages/share 共享文本和 url 很容易,但我想共享来自服务器的图像意味着它是 UR
在 Qt 文档中,它说 qreal是一个 Typedef for double unless Qt is configured with the -qreal float option. 这基本上意味
我想让 idris 证明 testMult : mult 3 3 = 9有人居住。 不幸的是,这是键入为 mult (fromInteger 3) (fromInteger 3) = fromInte
如您所知,Apple 为 NSNumber、NSDictionary、NSArray 等类提供了 @literals,因此我们可以通过这种方式创建对象,例如 NSArray *array = @[ob
有没有办法在类型上定义公共(public)文字(C# 中的公共(public) const)?显然 let 类型中的绑定(bind)必须是私有(private)的,并且 Literal 属性不能应用于
为什么下面的语法不能识别 bool 值? 我已经将其与 Java 和 GraphQL 的语法进行了比较,但不明白为什么它不起作用。 给定以下语法,解析如下: foo = null // foo = v
当我需要一个文字来测试一个带有序列的函数时,我注意到我自己的习惯比列表更频繁地使用向量。 IE。 : (map inc [1 2 3]) 但不是: (map inc (list 1 2 3)) 虽然它
是否可以在sqlite中制作类似的东西? FOREIGN KEY(TypeCode, 'ARawValue', IdServeur) REFERENCES OTHERTABLE(TypeCode, T
在我这学期的系统软件类(class)中,我们正在学习汇编程序和其他系统软件。在阅读整个类(class)时,我遇到了LITERALS主题。 对文字和立即操作数进行了比较,发现它们之间的唯一区别是文字不被
我正在使用命令行语法编写一个 gstreamer 管道来发送视频流,并想用它发送数据。我认为可行的一种解决方案是将数据作为字幕文件发送。 我可以使用以下管道通过 rtp 多路复用视频和字幕文件: gs
我是一名优秀的程序员,十分优秀!