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.

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é ...


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


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.


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.


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();

7

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

Long i = 1234L;

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.


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


2

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

Integer intVal = 1;
Long longVal = (long) (int) intVal


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

0

C'est null-safe

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

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();

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

-1

Essayez de convertirValue par Jackson

ObjectMapper mapper = new ObjectMapper()
Integer a = 1;
Long b = mapper.convertValue(a, Long.class)

É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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.