Comment convertir de int en Long en Java?

219

Je continue à trouver à la fois ici et les gens de Google ayant des problèmes allant de longla , intet non l'inverse. Pourtant, je suis sûr que je ne suis pas le seul à avoir rencontré ce scénario avant de passer de intà Long.

Les seules autres réponses que j'ai trouvées étaient "Il suffit de le définir comme Long en premier lieu", ce qui ne répond vraiment pas à la question.

J'ai d'abord essayé le casting mais j'obtiens 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);
}

Comme vous pouvez l'imaginer, je suis un peu perplexe, je suis coincé à utiliser intcar certains contenus arrivent en tant que ArrayListet l'entité pour laquelle je stocke ces informations nécessite le numéro de séquence en tant que Long.

Fantôme
la source
for (long i = 0; i <myList.size (); ++ i) fonctionne aussi
Instantsoup
@Instantsoup Oui, cela fonctionnera pour la boucle, mais comme je l'ai spécifié au bas de ma question, la ArrayList avec laquelle je travaille requiert la primitive int lors de la spécification de la position d'index à obtenir
Ghosty
long longValue = intValue | 0L;
Daniel Jipa
Ce que j'ai fait, c'est: lancer intd' longabord, puis attribuer longà Long. par exempleint x = 2; Long y = (long)x;
Eric Wang

Réponses:

244

Notez qu'il existe une différence entre un cast vers longet un cast vers Long. Si vous transtypez en long(une valeur primitive), il doit alors être automatiquement encadré en un Long(le type de référence qui l'enveloppe).

Vous pouvez également utiliser newpour créer une instance de Long, l'initialiser avec la intvaleur.

Daniel Earwicker
la source
31
Pour démontrer ce qu'Earwicker a dit, vous pouvez appeler Long.valueOf (i), ce qui prend du temps mais élargira un int et vous rendra un objet Long.
Grundlefleck
1
Autoboxing est préférable, car il ne doit pas nécessairement créer un nouvel Longobjet à chaque fois.
Michael Myers
2
(Attention: le reste de ce commentaire est une conjecture et une conjecture) Si les valeurs données à Long.valueOf () se situent entre 0 et 128, ce qui est très courant, et qu'il renvoie une instance mise en cache, cela sera-t-il préférable à l'autoboxing? (Je peux poser une nouvelle question si vous pensez que ça vaut le coup ...)
Grundlefleck
4
Autoboxing fait la même chose que cela. Au fait, c'est entre -127 et 128.
Daniel Earwicker
6
@Grundlefleck: Autoboxing utilise Long.valueOf()(si je me souviens bien), donc il n'y aurait pas de différence du tout. Mon commentaire était en réponse à la réponse, pas à votre commentaire.
Michael Myers
194

Utilisez ce qui suit: Long.valueOf(int);.

serg
la source
5
Attention, car cela générera une NullPointerException si vous recevez un objet Integer qui est nul.
will824
2
correct si je suis wron je pensais que la réponse est vieille parce que je ne peux pas trouver la méthodeLong.valueOf(int) !!
shareef
5
@ will824 - une variable primitive 'int' ne peut pas être nulle.
Rondo
1
@shareef - voir le commentaire de serg - mais je pense que cette méthode transforme l'intent en un long qui s'autoboxe avec un Long ... semble donc redondant
Rondo
1
@Rondo an Integercan, c'est ce qu'il a dit.
Moira
17

Si vous avez déjà l'intégré comme entier, vous pouvez le faire:

Integer y = 1;
long x = y.longValue();
saret
la source
12

utilisation

new Long(your_integer);

ou

Long.valueOf(your_integer);
Mohammadreza Tavakoli
la source
6

J'ai ce petit jouet, qui traite également des interfaces non génériques. Je suis d'accord avec le lancement d'une exception ClassCastException si le flux est incorrect (OK et heureux)

public class TypeUtil {
    public static long castToLong(Object o) {
        Number n = (Number) o;
        return n.longValue();
    }
}
Maxim Veksler
la source
6

En Java, vous pouvez faire:

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

dans votre cas ce serait:

content.setSequence(new Long(i));
temps nuageux
la source
6

Que diriez-vous

int myInt = 88;

// Ne compile pas

Long myLong = myInt;

// Compile et conserve l'esprit non NULL de int. Le meilleur casting n'est pas du tout lancé . Bien sûr, votre cas d'utilisation peut nécessiter des valeurs NULL longues et possibles. Mais si l'int, ou d'autres longs sont votre seule entrée, et que votre méthode peut être modifiée, je suggère cette approche.

long myLong = myInt;

// Compile, est le moyen le plus efficace et indique clairement que la valeur source est et ne sera jamais NULL.

Long myLong = (long) myInt;
Steven Spungin
la source
3

Nous obtiendrons la valeur longue en utilisant la Numberréférence.

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

Cela fonctionne pour tous les types de nombres, voici 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

}
Thamme Gowda
la source
3
 1,new Long(intValue);
 2,Long.valueOf(intValue);
Vicky
la source
2

J'ai eu beaucoup de mal avec ça. Je voulais juste:

thisBill.IntervalCount = jPaidCountSpinner.getValue();

Où IntervalCount est un Long et le JSpinner a été défini pour renvoyer un Long. Finalement, j'ai dû écrire cette fonction:

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

qui semble faire l'affaire. Aucune quantité de casting simple, aucune des solutions ci-dessus n'a fonctionné pour moi. Très frustrant.

MaskedCoder
la source
1
si jPaidCountSpinner.getValue()renvoie un objet qui est en fait un Long, il vous suffit de placer un (Long)plâtre devant. Essayez également de mettre un point d'arrêt sur votre chèque pour int.classou long.classetc. Et si vous avez un objet semblable à un nombre, il le supportera java.util.Number, alors convertissez-le en cela et appelez la longValueméthode. Pas besoin de passer par une chaîne dans ce cas. Cette fonction pourrait donc être un peu simplifiée, même si vous devez également gérer les chaînes. (Une partie du problème ici est la mauvaise documentation de référence pour JSpinner).
Daniel Earwicker
1
Moi aussi, j'ai fini par faire quelque chose comme ça. Je n'étais pas sûr du type de numéro que je recevrais et j'étais prêt à le convertir en Long avec peu de souci d'efficacité mais en voulant éviter le passe-partout.
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)
Virendra Singh
la source
0

Dès qu'il n'y a qu'une méthode Long.valueOf(long), le cast de intà longse fera implicitement en cas d'utilisation Long.valueOf(intValue).

La façon la plus claire de le faire est

Integer.valueOf(intValue).longValue()
Stanislav Tsepa
la source
longValueest juste un (long), donc la seule chose que vous "gagnez" ici est Integerle cache interne de.
Martin Schröder