文字中的隐式转换

时间:2017-11-30 16:59:55

标签: java implicit-conversion literals

默认情况下,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,这很容易适合一个短变量。 发生了什么事?

4 个答案:

答案 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