[英]Java: why the “long” primitive type does not accept a simple number?
我有一个接收long
类型参数的方法,我试着称它传递1
:
contato.setId(1);
我收到了这个:
The method setId(Long) in the type Contato is not applicable for the arguments (int).
但是,是不是1
较长的数字呢? 是不是在长范围内 ?
PS:只是说,我用这段代码解决了这个问题:
Integer y = 1;
long x = y.longValue();
contato.setId(x);
这只是一个狡猾的问题。
你应该使用contato.setId(1L);
(注意“L”后缀)
文字“1”表示原始int
值,它被转换为java.lang.Integer
包装类。
long
是一个包含64位的数据类型(不要与Object Long
混淆!)与int(32位),因此您不能使用从int
到long
的简单赋值。 请参阅: http : //docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
为了了解如何声明各种数据类型,您应该具体检查下表 :
Datatype Default Value
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u0000'
Object null
boolean false
所以,对于你的情况, long
应该用数字后跟L
来声明,例如:
long x = 100L;
进一步,做你正在做的自动装箱 :
Integer y = 1;
long x = y.longValue();
这不仅是不必要的 - 它也非常浪费。 因此,例如,如果你将在一个循环(多次)中执行它,你的代码将在数量级上变慢!
Long
不是原始类型, long
是。 使用包装类而不是基元类型时,需要通过添加L
后缀向编译器明确指示传递的参数是long
:
contato.setId(1L);
或者您可以简单地更改setId
方法,以便它采用原始的long
参数。
setId
采用大写L Long
,这是Java的小写l long
(AKA 64位整数)的包装器。 因此,Java很容易知道如何在不做任何特殊操作的情况下将long
转换为Long
。 所以,就像其他答案一样,你可以简单地做setId(1L)
,它给它一个long
,很容易转换为Long
。
但是,如果必须使用32位int
,则必须先将其转换为long
或Long
,以便Java知道如何处理它。 你看,Java并不知道如何将小写-i int
转换为大写-L Long
,只知道大写-I Integer
( int
周围的包装类)。
所以,假设你的int的名字是i
,你也可以使用它们:
setId((long)i); // Cast your int to a long, which Java can turn into a Long
setId((Long)(long)i); // Cast your int to a long, then that long to a Long
setId(new Long(i)); // Create a new Long object based on your int
setId(Long.valueOf(i)); // Get the Long version of your int
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.