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

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不也是一个很长的数字吗?不是在long scope里面吗?

PS:顺便说一句,我用这段代码解决了问题:

Integer y = 1;
long x = y.longValue();
contato.setId(x);

这只是一个教学问题。

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

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

Long 不是原始类型,long 是。当使用包装器 类 而不是原始类型时,您需要通过添加 L 后缀向编译器显式指示传递的参数是 long

contato.setId(1L);

或者您可以简单地更改 setId 方法,使其采用原始 long 参数。

long 是一种包含 64 位的数据类型(不要与对象 Long 混淆!)与 int(32 位),因此您不能使用简单的赋值intlong。参见:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

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

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;

此外,用autoboxing做你正在做的事情:

Integer y = 1;
long x = y.longValue();

不仅没有必要,而且非常浪费。因此,例如,如果您在一个循环中(多次)执行此操作,您的代码将按数量级变慢!

setId 采用大写字母 L Long,这是 Java 对小写字母 l long(也称为 64 位整数)的包装。正因为如此,Java 很容易知道如何将 long 转换为 Long,而无需您执行任何特殊操作。所以,就像其他答案所说的那样,你可以简单地做 setId(1L),它给它一个 long,它很容易转换成 Long.

但是,如果必须使用 32 位 int,则必须先将其转换为 longLong,因此 Java 知道如何处理它。你看,Java 不知道如何隐含地将小写字母-i int 转换为大写字母-L Long,只知道如何转换为大写字母-I Integer(包装器 class 大约 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