簡體   English   中英

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較長的數字呢? 是不是在長范圍內

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位),因此您不能使用從intlong的簡單賦值。 請參閱: 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 ,則必須先將其轉換為longLong ,以便Java知道如何處理它。 你看,Java並不知道如何將小寫-i int轉換為大寫-L Long ,只知道大寫-I Integerint周圍的包裝類)。

所以,假設你的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM