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
相同的机制用于Integer和Byte实例化.但Long的工作完全不同.以下代码给出了编译时错误
Long l = 10;
Long使用相同的方法进行长类型的自动装箱,所以
Long l = 10L; //is valid and is translated into Long.valueOf(10L)
我不明白为什么int不能分配给Long变量.对此事有何想法?
解决方法:
我认为这个问题不是关于一般的原始和包装.
问题是关于将java转换为java.lang.Long和int转换为java.lang.Short之间的区别.
JLS:
“此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):
>如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示.
>如果变量的类型是:可以使用缩小的基元转换,然后进行装箱转换:
>字节和常量表达式的值可在类型字节中表示.
> Short和常量表达式的值可以在short类型中表示.
>字符和常量表达式的值可在char类型中表示.
因此,所有< = 32位原语都可以轻松地进行转换,而长(64位)则需要特殊的转换.
这似乎是不合逻辑的.
像往常一样,所有不合逻辑的东西都有解释java中的后向兼容性或历史演变.
例如.自1.0版以来,java中存在Integer和Long类.从1.1开始,java中存在Short和Byte类.
那是在起始点,整数可以是两种类型:整数或长整数.所以我认为这两种数字有不同的投射规则.然后添加了short和byte.
我认为short和byte可以在具体的JVM中实现32位.
标签:java,primitive-types
来源: https://codeday.me/bug/20190925/1816482.html