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 位),因此您不能使用简单的赋值int
到 long
。参见: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
,则必须先将其转换为 long
或 Long
,因此 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
我得到了一个接收 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 位),因此您不能使用简单的赋值int
到 long
。参见: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
,则必须先将其转换为 long
或 Long
,因此 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