[英]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.