2015-02-05 52 views
5

我得到了一個接收型long一個parameher方法,我嘗試把它傳遞1Java:爲什麼「long」原始類型不接受簡單數字?

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); 

這只是一個didatic問題。

+2

如果方法接受一個小-1'long',它會工作得很好;它只是INT文字不能直接autobox爲'Long'。的 – 2015-02-05 20:14:53

+0

可能重複[怎麼浮法變成雙這兒?](http://stackoverflow.com/q/3680879/217324) - 我的答案也解釋了路易的評論中提到的自動裝箱限制背後的決策 – 2015-02-05 20:34:46

回答

5

long是一個包含64位數據類型與int類型(32位)(不要與對象Long!混淆),所以你不能用一個簡單的任務從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(); 

不僅是不必要的 - 它也是非常浪費。所以,舉個例子,如果你在一個循環中執行(很多次),你的代碼會在數量級上變慢!

7

應使用contato.setId(1L);(注意「L」後綴)

字面「1」表示一個基本int值,它被澆鑄到java.lang.Integer包裝類。

2

Long不是原始類型,long是。當使用包裝類而不是基本類型,你需要明確地指示編譯器傳遞的參數是通過添加L後綴long

contato.setId(1L); 

或者,你可以簡單地改變setId方法,使其取而代之的是一個原始的long參數。

+1

有還有一種可能性,即在SETID參數類型的資本「L」是一個錯字,和正確的解決方法是使其採取原始的'long'。 – 2015-02-05 20:35:47

0

setId需要大寫-L Long,這是Java的小寫字母-l long(又名64位整數)的包裝。因此,Java很容易知道如何將long轉換爲Long,而無需執行任何特殊的操作。所以,就像其他答案所說的,你可以簡單地做setId(1L),它給它一個long,它很容易轉換成Long

但是,如果您必須使用32位的int,則必須先將其轉換爲longLong,以便Java知道如何處理它。你看,Java不隱知道如何爲小寫,我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 
相關問題