默认情况下,Java假定您使用文字定义了一个int值。
[...]
// Make sure the URLs are HTTP, HTTPS, or FTP.
let isWeb = ["https", "http", "ftp"];
if (isWeb.indexOf(engineURL.scheme) < 0)
throw "Unsupported search engine URL: " + engineURL;
if (iconURL && isWeb.indexOf(iconURL.scheme) < 0)
throw "Unsupported search icon URL: " + iconURL;
[...]
但是当我们在算术表达式中使用“x”变量时,例如:
short x = 20; // There is an implicit conversion
我们知道20 * 2的结果是40,这很容易适合一个短变量。 发生了什么事?
答案 0 :(得分:5)
因为x
不是最终的,所以当程序到达以下点时,无法保证变量仍为20:
short y = x * 2;
编译器只考虑你的非最终变量x可能在那个时候(通过任何方式)改变的可能性,因此不会将其简单地视为20。 如果将x定义为final,则隐式对话将起作用:
final short x = 20; // There is an implicit conversion
short y = x * 2; //DOES COMPILE
答案 1 :(得分:0)
我不知道编译器的实现细节。我想原因是编译器没有办法检查,因为在编译时可能不知道x的值。所以它只能假设它是一个int。否则,您还希望编译器如何表现?
如果你看一下*运算符原型, 见:https://www.cs.cmu.edu/~pattis/15-1XX/15-200/lectures/voe/lecture.html
(int,int)只有一个,所以从技术上讲,没有一个(短,短)。
那么你可能会问为什么短x = 20有效? 原因是Java只允许自动转换为空,如果它是常量,在这种情况下“20”是最终的,而x * 2不是最终的 看到: Java - short and casting
答案 2 :(得分:0)
当您编写short x =20
时,java会成功编译它,但是当您编写short y=x *2
时,它将被视为int,您必须将其强制转换为short y =(short)x*2
答案 3 :(得分:0)
您可以使用以下符号使用强制转换将算术运算的结果分配给y
(如果您不想x
final
):
short y = (short)(x * 2);
我认为答案是Java语言规范。请看4.2.2点,有一个数值运算符列表,它们产生int或long类型的值,这就是为什么java将它视为int并且需要强制转换的原因: https://docs.oracle.com/javase/specs/jls/se9/html/jls-4.html#jls-4.2.2