Java:为什么" long"原始类型不接受简单的数字?

时间:2015-02-05 20:11:32

标签: java casting int long-integer primitive-types

我有一个接收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);

这只是一个荒谬的问题。

4 个答案:

答案 0 :(得分:7)

您应该使用contato.setId(1L);(注意“L”后缀)

文字“1”表示原始int值,它被转换为java.lang.Integer包装类。

答案 1 :(得分:5)

long是一个包含64位的数据类型(不要与Object Long混淆!)与int(32位),因此您不能使用{{{ 1}}到int。请参阅:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

为了了解如何声明各种数据类型,您应该专门检查following table

long

因此,对于您的情况,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

此外,使用autoboxing执行您正在执行的操作:

long x = 100L;

不仅不必要 - 它也非常浪费。因此,例如,如果你将在一个循环(多次)中执行它,你的代码将在数量级上变慢!

答案 2 :(得分:2)

Long不是原始类型,long是。使用包装类而不是基元类型时,需要通过添加long后缀向编译器明确指出传递的参数是L

contato.setId(1L);

或者您可以简单地更改setId方法,以便它取代原始long参数。

答案 3 :(得分:0)

setId使用大写字母L Long,它是Java的小写l long(AKA 64位整数)的包装器。因此,Java很容易知道如何在不做任何特殊操作的情况下将long转换为Long。所以,就像其他答案一样,你可以简单地做setId(1L),它会给它一个long,它很容易转换为Long

但是,如果必须使用32位int,则必须先将其转换为longLong,以便Java知道如何处理它。你看,Java不知道如何将小写-i int转换为大写-L Long,只知道大写-I Integer({{1}周围的包装类}})。

因此,假设您的int名称为int,您也可以使用这些名称:

i