Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:为什么可以';我不能把int转换为Long吗_Java_Primitive Types - Fatal编程技术网

Java:为什么可以';我不能把int转换为Long吗

Java:为什么可以';我不能把int转换为Long吗,java,primitive-types,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 同样的机制适用于整数和字节实例化。但Long的工作原理完全不同。下面的代码给出了编译时错误 Long l

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
同样的机制适用于
整数
字节
实例化。但Long的工作原理完全不同。下面的代码给出了编译时错误

Long l = 10;
Long对长类型的自动装箱使用相同的方法,因此

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

我不明白为什么int不能分配给长变量。对此有什么想法吗?

因为第一个大写字母的Long是一个包装类,而不是原始类型


看看。

您可以将
int
转换为
long
long
转换为
long

但是您不能将
int
转换为
Long


longl=(Long)10是正确的

我认为问题不在于一般地铸造原语和包装器。 例如,问题在于将int转换为java.lang.Long和int转换为java.lang.Short之间的区别

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

  • 如果变量的类型是byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用窄化原语转换
  • 如果变量类型为:
    • 字节,常量表达式的值可在字节类型中表示
    • Short,常量表达式的值可在Short类型中表示
    • 字符和常量表达式的值可在“char”类型中表示
均1,新长(intValue)

2,长值of(intValue)


是的,我知道Long是包装类型,int是原语。问题在于自动装箱本身。为什么编译器不使Long l=Long.valueOf(1);或长l=新长(1);虽然它可以对Short和Byte包装类型执行此操作,“java中的所有数字都应该是int类型。”…什么?实际上,我的意思是:如果您编写somevar=10,那么对于语句Byte a=10,它实际上会变成Byte a=(Byte)10,其中10实际上是int类型
Short
也是一个包装类。这并不能解决行为上的差异。但您可以通过这种方式分配
Short
。问题是:为什么会有差异?这不是强制转换,而是通过向构造函数发送int值来创建新变量。最好不要创建新对象,而不是像这样构造新对象,您可以强制转换为原语long:
(long)intValue