为什么用int literal初始化新的Long Wrapper是有效的?

时间:2017-07-23 08:19:20

标签: java initialization long-integer

查看Java Doc for Long,它只有两个构造函数:

    1) primitive long as param --> new Long(10L);  
    2) String as param --> new Long("23");

但这很有效 新龙(23);

但是如果文字超过int MAX VALUE(2147483647),则L后缀成为必需的,因此: new Long(2147483648)现在需要在值

之后的L

然而: new Long(Integer.MAX_VALUE + 1)没问题

谁可以解释一下?

4 个答案:

答案 0 :(得分:4)

问题的第一部分很简单:允许int传递所需的long,因为任何可以表示为int的数字也可以表示为{{ 1}}。这是所谓的扩展转换

关于long的第二部分比较棘手。虽然这里也发生了扩大转换,但它并没有人们想到的价值:如果你运行这个程序

new Long(Integer.MAX_VALUE + 1)

你得到的是Long x = new Long(Integer.MAX_VALUE + 1); System.out.println(x); ,而不是预期的-2147483648,因为加2147483648int溢出了。

在执行添加之前,编译器不够智能,无法将表达式的某些部分提升为long 。在执行添加之后,对添加溢出的结果进行加宽转换。

答案 1 :(得分:0)

您可以在javadocs中找到答案:

  

在strictfp表达式(第15.4节)中,从整数类型到另一个整数类型或从float到double的扩展原语转换根本不会丢失任何信息;数值完全保留。

整数值23可以转换为长23L而不会丢失任何信息。因此,通过使用扩展原始转换,JVM会隐式将其转换为23L

所以当你打电话

new Long(23)

变成

new Long(23L)

答案 2 :(得分:0)

当我们写new Long(23)时,您可以将其视为以下情况:

int i = 23;
long l = i; // widening primitive conversion
Long newLong = new Long(l);

根据JLS 5.1.2允许扩展转化次数,因此没有任何问题。

当我们尝试new Long(2147483648)时,第一步本身就会失败,因为价值高于int

的价值
 int i = 2147483648;  // doesn't fit in int

当我们尝试new Long(Integer.MAX_VALUE + 1)时,您可以将其视为以下情况:

 int i = Integer.MAX_VALUE + 1; // This gives the INTEGER.MIN_VALUE -2147483648
 long l = i ; // widening primitive conversion
 Long newLong = new Long(l);

所以,这是允许的。希望这会有所帮助。

答案 3 :(得分:0)

差异来自于否使用文字。

使用文字,

long1 = new Long(2147483648)

代码将无法编译,因为编译器再次检查文字的有效性,接收文字值的变量类型2147483648超出int的范围。
因此编译器会发出错误。

它适用于任何文字。
作为compiler expects to have a specific type as value of the literals,所以它会进行检查:

文字的类型确定如下:

  

以L或l结尾的整数文字(第3.10.1节)的类型很长   (§4.2.1)。

     

任何其他整数文字的类型是int(§4.2.1)。

     

...

通过使用计算:

long1 = new Long(Integer.MAX_VALUE + 1);

编译器不会检查Long参数构造函数的大小是否在int范围内。
这不是文字宣言 在运行时,会发生intlong扩展原语转换。

它产生int Integer.MAX_VALUE + 1 -2147483648 int(溢出long),转换为python_mission = """ The mission of the Python Software Foundation is to promote, protect, and advance the Python programming language, and to support and facilitate the growth of a diverse and international community of Python programmer """ print(“The word returned is: {}”.format(python_mission[25:34])) 值。