Conversion d'un entier en long

108

J'ai besoin d'obtenir la valeur d'un champ en utilisant la réflexion. Il se trouve que je ne suis pas toujours sûr du type de données du champ. Pour cela, et pour éviter une duplication de code, j'ai créé la méthode suivante:

@SuppressWarnings("unchecked")
private static <T> T getValueByReflection(VarInfo var, Class<?> classUnderTest, Object runtimeInstance) throws Throwable {
  Field f = classUnderTest.getDeclaredField(processFieldName(var));
  f.setAccessible(true);
  T value = (T) f.get(runtimeInstance);

  return value;
}

Et utilisez cette méthode comme:

Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);

ou

Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance);

Le problème est que je n'arrive pas à lancer un casting Integervers Long:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

Y a-t-il une meilleure façon d'y parvenir?

J'utilise Java 1.6.

Tiago Veloso
la source

Réponses:

91

Non, vous ne pouvez pas diffuser Integervers Long, même si vous pouvez convertir de intvers long. Pour une valeur individuelle connue pour être un nombre et que vous souhaitez obtenir la valeur longue, vous pouvez utiliser:

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp.longValue();

Pour les tableaux, ce sera plus compliqué ...

Jon Skeet
la source
Pour les tableaux, je peux utiliser un Number[]et une boucle dessus pour créer un tableau correctement typé, non?
Tiago Veloso le
@Tiago: Cela dépend de ce que la méthode renvoie réellement . Cela ne fonctionnerait pas pour double[]par exemple, mais cela fonctionne pour un Double[].
Jon Skeet le
7
Pourquoi ne pouvez-vous pas passer d'un entier à un long?
MrMas
@MrMas: Comme ce sont des types de référence distincts, les deux sous-classes directes de Number. Ou pour le dire autrement: quelle règle de conversion pensez-vous vous permet de passer de l'une à l'autre?
Jon Skeet
6
D'accord. Le problème est l'héritage. Je pense en termes de précision. Un entier peut être converti en un entier long sans perdre d'informations. Mais la structure d'héritage ne contient aucune information qui indiquerait cela au compilateur.
MrMas
134

Simplement:

Integer i = 7;
Long l = new Long(i);
vahid kh
la source
10
NPE est lancé si l'entier est nul
lux
2
Fonctionne pour les intvaleurs.
DARKpRINCE
11
Long.valueof doit être utilisé: stackoverflow.com/questions/2974561/new-integer-vs-valueof
luckyluke
Ce code fonctionne (Java déballe implicitement le Integerto int, puis le convertit en longavant de passer au Long(long)constructeur maintenant obsolète .
Ole VV
53
Integer i = 5; //example

Long l = Long.valueOf(i.longValue());

Cela évite l'atteinte des performances de la conversion en chaîne. La longValue()méthode Integer est juste une conversion de la valeur int. La Long.valueOf()méthode donne au vm une chance d'utiliser une valeur mise en cache.

Rich MacDonald
la source
2
Pour être nul, sauvegardez: Long l = i == null? null: i.longValue ()
Adrodoc55
19

Curieusement, j'ai trouvé que si vous analysez à partir d'une chaîne, cela fonctionne.

 int i = 0;
 Long l = Long.parseLong(String.valueOf(i));
 int back = Integer.parseInt(String.valueOf(l));

Gagner.

Anon
la source
1
Cela n'a absolument aucun sens pour moi, mais cela fonctionne comme un charme. Merci beaucoup!
Bouncner
33
Introduire une conversion de chaîne sans raison est une très mauvaise idée ... il n'y a tout simplement aucun avantage à faire cela.
Jon Skeet
6
D'accord avec @JonSkeet, mieux vaut avec ceci: Object i = 10; Long l = ((Number) i) .longValue ();
depsypher
1
Cette méthode fonctionne bien mais est relativement lente et utilise plus de mémoire que les autres méthodes pour le faire ...
krispy
1
ressemble beaucoup du point de vue du développeur front-end
Ezeewei
8

Conversion d'un entier en long très simple et de nombreuses façons de convertir cet
exemple 1

 new Long(your_integer);

Exemple 2

Long.valueOf(your_integer); 

Exemple 3

Long a = 12345L;

Exemple 4
Si vous avez déjà tapé int comme un entier, vous pouvez le faire:

Integer y = 12;
long x = y.longValue();
Naresh Kumar
la source
7

Convertissez directement un entier en long en ajoutant «L» à la fin de Integer.

Long i = 1234L;
Jeff Johny
la source
5
Je suis sûr que vous avez répondu sans lire toute la question!
Diablo
3
@Diablo cette question est le premier résultat lors de la recherche "int to long" sur Google, cette réponse peut être utile à d'autres
Dimitri W
1
@DimitriW Je ne dis pas que cette réponse est fausse, mais je dis que la réponse à cette question est fausse. Vous avez raison, ceci est utile pour les personnes qui ne lisent pas la question et ne regardent que la réponse.
Diablo
7

Si l'entier n'est pas nul

Integer i;
Long long = Long.valueOf(i);

isera automatiquement converti en fichier long.

L'utilisation valueOfau lieu de newpermet la mise en cache de cette valeur (si elle est petite) par le compilateur ou la JVM, ce qui permet un code plus rapide.

perdu dans la traduction
la source
Je ne trouve pas de méthode Long.valueOf (Integer i), les seules que je trouve sont valueOf (long l), valueOf (String s) et valueOf (String s, int radix). Recherche de documents Java8 et Java9.
Andy
1
Un entier est implicitement converti en un type long primitif.
lostintranslation
5
((Number) intOrLongOrSomewhat).longValue()
max.kuzmentsov
la source
2

Si vous savez que l'Integer n'est pas NULL, vous pouvez simplement faire ceci:

Integer intVal = 1;
Long longVal = (long) (int) intVal
Steven Spungin
la source
1
new Long(Integer.longValue());

ou

new Long(Integer.toString());
Pavlo Zvarych
la source
1

Un analyseur de intvariables au longtype est inclus dans la Integerclasse. Voici un exemple:

int n=10;
long n_long=Integer.toUnsignedLong(n);

Vous pouvez facilement utiliser cette fonction intégrée pour créer une méthode qui analyse de intà long:

    public static long toLong(int i){
    long l;
    if (i<0){
        l=-Integer.toUnsignedLong(Math.abs(i));
    }
    else{
        l=Integer.toUnsignedLong(i);
    }
    return l;
}
Bremsstrahlung
la source
0

C'est null-safe

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp == null ? null : tmp.longValue();
Adkisson
la source
0

Si vous ne connaissez pas la classe exacte de votre nombre ( Integer , Long , Double , peu importe), vous pouvez convertir en Number et en tirer votre valeur longue:

Object num = new Integer(6);
Long longValue = ((Number) num).longValue();
kaiser
la source
-1

Dans le cas d'une Liste de type Long, Ajout de L à la fin de chaque valeur Integer

List<Long> list = new ArrayList<Long>();
list  = Arrays.asList(1L, 2L, 3L, 4L);
Joydeep Dutta
la source
-1

Essayez de convertirValue par Jackson

ObjectMapper mapper = new ObjectMapper()
Integer a = 1;
Long b = mapper.convertValue(a, Long.class)
citronzone2010
la source
Évalué parce que ce n'est certainement pas la meilleure réponse: cette solution ajoute une complexité inutile, une surcharge de performances et nécessite une bibliothèque supplémentaire (Jackson)
NickGreen