2009-08-19 25 views
167

Continuo a trovare entrambi qui e Google persone che hanno problemi passando da long a int e non viceversa. Eppure sono sicuro di non essere l'unico ad aver imbattuto in questo scenario prima di passare dallo int allo Long.Come posso convertire da int a Long in Java?

Le uniche altre risposte che ho trovato sono state "Basta impostare come Long in primo luogo" che in realtà non risolve la domanda.

Qualcuno può aiutarmi qui? Inizialmente ho provato la fusione, ma ho 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 si può immaginare io sono un po 'perplesso, mi sono bloccato con int poiché alcuni contenuti è in arrivo come un ArrayList e il soggetto per il quale ho La memorizzazione di queste informazioni richiede che il numero di sequenza sia Long.

Grazie!

+0

per (lungo i = 0; i Instantsoup

+0

@Instantsoup Sì che funzionerà per il ciclo, ma come ho specificato nella parte inferiore della mia mettere in discussione l'ArrayList con cui sto lavorando richiede l'int primitivo quando si specifica quale posizione dell'indice ottenere – Ghosty

+0

long longValue = intValue | 0L; –

risposta

203

Si noti che c'è una differenza tra un cast a long e un cast a Long. Se lanci su long (un valore primitivo), allora dovrebbe essere automaticamente inserito in un Long (il tipo di riferimento che lo avvolge).

In alternativa, è possibile utilizzare new per creare un'istanza di Long, inizializzandola con il valore int.

+21

Per dimostrare cosa ha detto Earwicker, è possibile chiamare Long.valueOf (i), che richiede molto tempo, ma amplierà un int e restituirà un oggetto Long. – Grundlefleck

+0

È preferibile il boxing automatico, poiché non deve necessariamente creare un nuovo oggetto 'Long' ogni volta. –

+1

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

150

Utilizzare quanto segue: Long.valueOf(int);.

+1

Esiste un tale metodo? –

+17

C'è Long.valueOf (long) che funziona anche per int. – serg

+3

Attenzione, poiché genererà una NullPointerException se si riceve un oggetto intero che è null. – will824

13

Se hai già l'int tipizzato come un intero si può fare questo:

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

ho avuto una grande quantità di problemi con questo. Volevo solo:

thisBill.IntervalCount = jPaidCountSpinner.getValue(); 

Dove IntervalCount è un lungo, e il JSpinner è stato impostato per restituire un lungo. 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.

+0

se 'jPaidCountSpinner.getValue()' restituisce un oggetto che è in effetti un 'Long', è necessario solo mettere un cast' (Long) 'davanti. Prova anche a mettere un punto di interruzione sul tuo assegno per 'int.class' o' long.class' ecc. Ha mai colpito? E se hai un oggetto simile al numero, supporterà 'java.util.Number', quindi lo lanci e chiamerai il metodo' longValue'. In questo caso non è necessario passare una stringa. Quindi questa funzione potrebbe essere semplificata un po ', anche se devi anche occuparti di stringhe. (Parte del problema qui è la cattiva documentazione di riferimento per 'JSpinner'). –

5

Ho questo piccolo giocattolo, che si occupa anche di interfacce non generiche. Sto bene con esso gettando un ClassCastException se alimentate sbagliato (OK e felice)

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

In Java si può fare:

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

nel tuo caso sarebbe:

content.setSequence(new Long(i)); 
2

Si otterrà il valore lungo utilizzando il riferimento Number.

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

Funziona per tutti i tipi di numero, qui è 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 

} 
8

uso

new Long(your_integer); 

o

Long.valueOf(your_integer); 
2

Come su

int myInt = 88; 

// non compilerà

Long myLong = myInt; 

// compila, e mantiene lo spirito non NULL int. Il migliore cast è no cast. Naturalmente, il tuo caso d'uso potrebbe richiedere valori NULL lunghi e possibili. Ma se l'int, o altri long sono i tuoi soli 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; 
1
//Suppose you have int and you wan to convert it to Long 
int i=78; 
//convert to Long 
Long l=Long.valueOf(i)