Come faccio a convertire da int a Long in Java?


219

Continuo a trovare sia su qui e Google le persone che hanno problemi che vanno dal longal int, e non il contrario. Eppure sono sicuro di non essere l'unico ad aver incontrato questo scenario prima di passare da inta Long.

Le uniche altre risposte che ho trovato sono state "Impostalo come Long in primo luogo" che in realtà non risponde alla domanda.

Inizialmente ho provato a trasmettere ma ho ottenuto un " Cannot cast from int to Long"

for (int i = 0; i < myArrayList.size(); ++i ) {
    content = new Content();
    content.setDescription(myArrayList.get(i));
    content.setSequence((Long) i);
    session.save(content);
}

Come puoi immaginare sono un po 'perplesso, ne sono bloccato intpoiché alcuni contenuti stanno arrivando come ArrayListe l'entità per cui sto memorizzando queste informazioni richiede il numero di sequenza come Long.


perché (long i = 0; i <myList.size (); ++ i) funziona anche
Instantsoup

@Instantsoup Sì, che funzionerà per il loop, ma come ho specificato in fondo alla mia domanda, ArrayList con cui sto lavorando richiede l'int primitivo quando si specifica quale posizione dell'indice ottenere
Ghosty

long longValue = intValue | 0L;
Daniel Jipa,

Quello che ho fatto è: cast intdi longprima, quindi assegnare longa Long. ad es.int x = 2; Long y = (long)x;
Eric Wang,

Risposte:


244

Nota che c'è una differenza tra un cast longe un cast Long. Se si esegue il cast in long(un valore primitivo), dovrebbe essere automaticamente inscatolato in un Long(il tipo di riferimento che lo avvolge).

In alternativa, è possibile utilizzare newper creare un'istanza di Long, inizializzandola con il intvalore.


31
Per dimostrare ciò che Earwicker ha detto, potresti chiamare Long.valueOf (i), che richiede molto tempo ma allargherà un int e ti restituirà un oggetto Long.
Grundlefleck,

1
L'autoboxing è preferibile, perché non deve necessariamente creare un nuovo Longoggetto ogni volta.
Michael Myers

2
(Attenzione: il resto di questo commento è congetture e congetture) Se i valori dati a Long.valueOf () rientrano tra 0 e 128, il che è molto comune e restituisce un'istanza memorizzata nella cache, sarà preferibile rispetto al box automatico? (Potrei fare una nuova domanda se pensi che ne valga la pena ...)
Grundlefleck,

4
L'autoboxing fa la stessa cosa. A proposito, è tra -127 e 128.
Daniel Earwicker,

6
@Grundlefleck: Autoboxing utilizza Long.valueOf()(se ricordo bene), quindi non ci sarebbe alcuna differenza. Il mio commento era in risposta alla risposta, non al tuo commento.
Michael Myers

193

Utilizzare i seguenti: Long.valueOf(int);.


5
Fai attenzione, poiché questo genererà una NullPointerException se ricevi un oggetto Integer che è null.
will824,

2
corretto se am wron ho pensato che potrebbe essere la risposta è vecchia perché non riesco a trovare il metodoLong.valueOf(int) !!
shareef

5
@ will824 - una variabile 'int' primitiva non può essere nulla.
Rondo,

1
@shareef - vedi il commento di serg - ma penso che questo metodo riduca l'int a un lungo che si autoboxa con un Long ... quindi sembra ridondante
Rondo,

1
@Rondo an Integercan, che è quello che ha detto.
Moira,

17

Se hai già digitato int come numero intero, puoi farlo:

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


6

Ho questo piccolo giocattolo, che si occupa anche di interfacce non generiche. Sto bene lanciando una ClassCastException se il feed è errato (OK e felice)

public class TypeUtil {
    public static long castToLong(Object o) {
        Number n = (Number) o;
        return n.longValue();
    }
}

6

In Java puoi fare:

 int myInt=4;
 Long myLong= new Long(myInt);

nel tuo caso sarebbe:

content.setSequence(new Long(i));

6

Che ne dite di

int myInt = 88;

// Non compilerà

Long myLong = myInt;

// Compila e mantiene lo spirito non NULL di int. Il cast migliore non è affatto cast . Naturalmente, il tuo caso d'uso potrebbe richiedere valori NULL lunghi e possibili. Ma se int o altri long sono il tuo unico input e il tuo metodo può essere modificato, suggerirei questo approccio.

long myLong = myInt;

// Compila, è il modo più efficiente e chiarisce che il valore di origine è e non sarà mai NULL.

Long myLong = (long) myInt;

3

Otterremo il valore lungo usando il Numberriferimento.

public static long toLong(Number number){
    return number.longValue();
}

Funziona con tutti i tipi di numero, ecco un test:

public static void testToLong() throws Exception {
    assertEquals(0l, toLong(0));   // an int
    assertEquals(0l, toLong((short)0)); // a short
    assertEquals(0l, toLong(0l)); // a long
    assertEquals(0l, toLong((long) 0)); // another long
    assertEquals(0l, toLong(0.0f));  // a float
    assertEquals(0l, toLong(0.0));  // a double

}

3
 1,new Long(intValue);
 2,Long.valueOf(intValue);

2

Ho avuto molti problemi con questo. Volevo solo:

thisBill.IntervalCount = jPaidCountSpinner.getValue();

Dove IntervalCount è un Long e JSpinner è stato impostato per restituire un Long. Alla fine ho dovuto scrivere questa funzione:

    public static final Long getLong(Object obj) throws IllegalArgumentException {
    Long rv;

    if((obj.getClass() == Integer.class) || (obj.getClass() == Long.class) || (obj.getClass() == Double.class)) {
        rv = Long.parseLong(obj.toString());
    }
    else if((obj.getClass() == int.class) || (obj.getClass() == long.class) || (obj.getClass() == double.class)) {
        rv = (Long) obj;
    }
    else if(obj.getClass() == String.class) {
        rv = Long.parseLong(obj.toString());
    }
    else {
        throw new IllegalArgumentException("getLong: type " + obj.getClass() + " = \"" + obj.toString() + "\" unaccounted for");
    }

    return rv;
}

che sembra fare il trucco. Nessuna quantità di casting semplice, nessuna delle soluzioni di cui sopra ha funzionato per me. Molto frustrante.


1
se jPaidCountSpinner.getValue()restituisce un oggetto che in realtà è un Long, devi solo mettere un (Long)cast in primo piano. Prova anche a mettere un punto di interruzione sul tuo controllo per int.classo long.classecc. Lo ha mai colpito? E se hai un oggetto simile a un numero, lo supporterà java.util.Number, quindi lancialo su quello e chiama il longValuemetodo. Non è necessario passare tramite una stringa in quel caso. Quindi questa funzione potrebbe essere semplificata un po ', anche se è necessario gestire anche le stringhe. (Parte del problema qui è la documentazione di riferimento errata per JSpinner).
Daniel Earwicker,

1
Anch'io ho finito per fare qualcosa del genere. Non ero sicuro del tipo di numero che avrei ricevuto ed ero disposto a convertirlo in Long con poca preoccupazione per l'efficienza ma volevo evitare il bollettino.
Profiterole,

2
 //Suppose you have int and you wan to convert it to Long
 int i=78;
 //convert to Long
 Long l=Long.valueOf(i)

0

Non appena esiste un solo metodo Long.valueOf(long), il cast da inta longverrà eseguito implicitamente in caso di utilizzo Long.valueOf(intValue).

Il modo più chiaro per farlo è

Integer.valueOf(intValue).longValue()

longValueè solo un (long), quindi l'unica cosa che "guadagni" qui è Integerla cache interna.
Martin Schröder,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.