Java:为什么我不能将int转换为Long

时间:2011-10-14 09:47:09

标签: java primitive-types

Java中的所有数字都应该是int类型。 以下行在Java> 1.5

中是合法的
Short s = 1; // Will compile to Short s = Short.valueOf((short)1) - thus you can't exceed short max value i.e.
Short s =  4444; // is invalid for autoboxing

同样的机制适用于IntegerByte实例化。但Long的工作完全不同。以下代码给出了编译时错误

Long l = 10;

Long使用相同的方法进行长类型的自动装箱,所以

Long l = 10L; //is valid and is translated into Long.valueOf(10L)

我看不出为什么int不能分配给Long变量。对此事有何想法?

4 个答案:

答案 0 :(得分:8)

我认为这个问题不是关于一般的原始和包装。 问题是关于将java转换为java.lang.Long和int转换为java.lang.Short之间的区别。

JLS: “此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):

  • 如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。
  • 如果变量的类型是:则可以使用缩小的基元转换,然后使用装箱转换:
    • 字节和常量表达式的值可以在字节类型中表示。
    • 简短,常量表达式的值可在short类型中表示。
    • 字符和常量表达式的值可在char“。
    • 类型中表示

因此所有< = 32bit基元都可以轻松投射,长(64位)需要特殊投射。 这似乎是不合逻辑的。

像往常一样,所有不合逻辑的东西都有解释java中的后向兼容性或历史演变。 例如。自1.0版以来,java中存在Integer和Long类。从1.1开始,java中存在Short和Byte类。 那是在起始点,整数可以是两种类型:整数或长整数。所以我认为这两种数字有不同的投射规则。然后添加了short和byte。 我认为short和byte可以在具体的JVM中实现32位。

答案 1 :(得分:2)

因为带有第一个大写字母的Long是包装类而不是基本类型。

看看here

答案 2 :(得分:0)

您可以将int投放到long,将long投放到Long 但是你无法将int投射到Long

Long l = (long) 10;

是正确的

答案 3 :(得分:0)

1,新的Long(intValue);

2,Long.valueOf(的intValue);

https://stackoverflow.com/a/50225345/9744452