143 votes

Conversion d'un entier en un long

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 cette raison, et pour éviter la duplication du 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 utiliser cette méthode comme :

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

ou

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

Le problème, c'est que je n'arrive pas à lancer Integer à Long :

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

Existe-t-il un meilleur moyen d'y parvenir ?

J'utilise Java 1.6.

159voto

vahid kh Points 358

Tout simplement :

Integer i = 7;
Long l = new Long(i);

109voto

Jon Skeet Points 692016

Non, vous ne pouvez pas lancer Integer à Long même si vous pouvez convertir de int à long . Pour un individuel dont on sait qu'il s'agit d'un nombre et que l'on veut obtenir la valeur longue, on peut utiliser :

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

Pour les tableaux, ce sera plus délicat...

76voto

user625016 Points 61
Integer i = 5; //example

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

Cela permet d'éviter les problèmes de performance liés à la conversion en chaîne. Les longValue() dans Integer n'est qu'un moulage de la valeur de l'int. La méthode Long.valueOf() donne à la vm la possibilité d'utiliser une valeur mise en cache.

21voto

Anon Points 117

Curieusement, j'ai découvert que si l'on analyse à partir d'une chaîne de caractères, cela fonctionne.

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

Gagnez.

12voto

lostintranslation Points 384

Si l'entier n'est pas nul

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

i sera automatiquement transféré vers un long .

Utilisation valueOf au lieu de new permet la mise en cache de cette valeur (si elle est petite) par le compilateur ou la JVM, ce qui permet d'accélérer le code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X