2015-02-05 14 views
5

bekam ich eine Methode, die einen long Typ parameher empfängt, und ich versuche, es zu nennen 1 vorbei:Java: Warum akzeptiert der "lange" primitive Typ keine einfache Zahl?

contato.setId(1); 

Und ich erhalten diese:

The method setId(Long) in the type Contato is not applicable for the arguments (int). 

Aber ist nicht 1 eine lange Reihe auch? Ist es nicht innerhalb der langen Scope?

PS: Nur zu sagen, ich löste das Problem mit diesem Code:

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

Es ist nur eine Frage didatic.

+2

Wenn die Methode ein wenig l 'akzeptiert long', wäre es gut funktionieren; Es ist nur so, dass int-Literale nicht direkt zu 'Long' autoboxieren können. –

+0

mögliches Duplikat von [Wie ist ein Float hier zu einem Double geworden?] (Http://stackoverflow.com/q/3680879/217324) - meine Antwort dort erklärt die Entscheidungen, die hinter der in Louis erwähnten Autoboxing-Limitierung stehen –

Antwort

5

long ist ein Datentyp, der 64 Bit (nicht zu verwechseln mit dem Objekt Long!) Gegen einen int (32 Bit) enthält, so dass Sie nicht eine einfache Zuordnung von int zu long verwenden können. Siehe: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Um zu sehen, wie die verschiedenen Datentypen zu erklären, sollten Sie prüfen, speziell die 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 

Also, für Ihren Fall sollte long mit der Nummer von einer L gefolgt deklariert werden, zum Beispiel:

long x = 100L; 

Weiterhin tun, was Sie tun mit autoboxing:

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

ist nicht nur unnötig - es ist auch sehr verschwenderisch. Wenn Sie zum Beispiel in einer Schleife (oft) arbeiten, wird Ihr Code in der Größenordnung langsamer sein!

7

Sie sollten contato.setId(1L); verwenden (beachten Sie die "L" Suffix)

Die wörtliche "1" steht für einen primitiven int Wert, der mit einer java.lang.Integer Wrapper-Klasse gegossen wird.

2

Long ist kein primitiver Typ, long ist. Wenn die Wrapper-Klassen verwenden, anstatt die primitiven Typen, müssen Sie explizit an den Compiler, um anzuzeigen, dass das übergebene Argument ein long durch Hinzufügen des L Suffix ist:

contato.setId(1L); 

Oder Sie einfach die setId Methode so ändern kann, dass es nimmt stattdessen ein primitives long Argument.

+1

There Is auch eine Möglichkeit, dass das Kapital "L" auf dem Argumenttyp setId ein Tippfehler ist, und die richtige Lösung ist, es ein primitives "long" zu nehmen. –

0

setId nimmt eine kapital L Long, die Wrapper Java rund Klein-L ist long (AKA 64-Bit-Ganzzahl). Aus diesem Grund weiß Java einfach, wie man eine long in eine Long konvertieren kann, ohne etwas Besonderes zu tun. So, wie die anderen Antworten sagen, könnten Sie einfach tun setId(1L), die es eine long gibt, die es leicht in eine 10 umwandelt.

Wenn Sie jedoch eine 32-Bit int verwenden müssen, müssen Sie diese zuerst konvertieren zu einem long oder Long, so Java weiß, wie man damit umgeht. Sie sehen, Java weiß nicht implizit, wie man einen Kleinbuchstaben in einen Großbuchstaben konvertiert - L , nur in einen Großbuchstaben-I Integer (die Wrapper-Klasse um int).

So ist Ihr int Namen unter der Annahme i, können Sie diese auch verwenden:

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 
Verwandte Themen