141

I need to get the value of a field using reflection. It so happens that I am not always sure what the datatype of the field is. For that, and to avoid some code duplication I have created the following method:

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

And use this method like:

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

or

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

The problem is that I can't seem to cast Integer to Long:

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

Is there a better way to achieve this?

I am using Java 1.6.

Tiago Veloso
  • 8,513
  • 17
  • 64
  • 85

17 Answers17

159

Simply:

Integer i = 7;
Long l = new Long(i);
Paul Rooney
  • 20,879
  • 9
  • 40
  • 61
vahid kh
  • 1,874
  • 2
  • 12
  • 16
109

No, you can't cast Integer to Long, even though you can convert from int to long. For an individual value which is known to be a number and you want to get the long value, you could use:

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

For arrays, it will be trickier...

Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
  • For arrays I can use a `Number[]` and a loop over it to create an appropriately typed array, right? – Tiago Veloso Jul 14 '11 at 09:39
  • @Tiago: It depends on what the method's *actually* returning. That wouldn't work for a `double[]` for example, but *would* work for a `Double[]`. – Jon Skeet Jul 14 '11 at 09:40
  • 8
    Why can't you cast from an Integer to a Long? – MrMas Mar 26 '13 at 22:26
  • @MrMas: Because they're separate reference types, both direct subclasses of `Number`. Or to put it another way: which conversion rule do you believe *does* let you convert from one to the other? – Jon Skeet Mar 27 '13 at 06:44
  • 7
    Ok. The problem is inheritance. I'm thinking in terms of precision. An integer can be converted to a long integer without losing information. But the inheritance structure doesn't have any information that would tell the compiler that. – MrMas Mar 27 '13 at 13:50
75
Integer i = 5; //example

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

This avoids the performance hit of converting to a String. The longValue() method in Integer is just a cast of the int value. The Long.valueOf() method gives the vm a chance to use a cached value.

jelies
  • 9,110
  • 5
  • 50
  • 65
Rich MacDonald
  • 895
  • 6
  • 5
21

Oddly enough I found that if you parse from a string it works.

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

Win.

Anon
  • 267
  • 2
  • 2
12

If the Integer is not null

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

i will be automatically typecast to a long.

Using valueOf instead of new allows caching of this value (if its small) by the compiler or JVM , resulting in faster code.

Paul Rooney
  • 20,879
  • 9
  • 40
  • 61
  • I can't find a Long.valueOf(Integer i) method, the only ones I find are valueOf(long l), valueOf(String s) and valueOf(String s, int radix). Checked for Java8 and Java9 docs. – Andy Jan 10 '18 at 23:20
  • 3
    Integer is implicitly converted to a primitive long type. – lostintranslation Jan 16 '18 at 05:41
10

Converting Integer to Long Very Simple and many ways to converting that
Example 1

 new Long(your_integer);

Example 2

Long.valueOf(your_integer); 

Example 3

Long a = 12345L;

Example 4
If you already have the int typed as an Integer you can do this:

Integer y = 12;
long x = y.longValue();
Naresh Kumar
  • 794
  • 8
  • 25
7

Convert an integer directly to long by adding 'L' to the end of Integer.

Long i = 1234L;
Jeff Johny
  • 418
  • 1
  • 5
  • 19
  • 8
    I am sure you have answered without reading the entire question! – Diablo Mar 24 '16 at 12:06
  • 3
    @Diablo this question is the first result when searching "int to long" on Google, this answer may be useful to others – Dimitri W Oct 08 '16 at 23:20
  • 1
    @DimitriW I am not saying this answer is wrong, But I am saying the answer for this question is wrong. You are right,This is useful for those people who doesn't read the question and look at the answer only. – Diablo Oct 25 '16 at 08:55
5
((Number) intOrLongOrSomewhat).longValue()
max.kuzmentsov
  • 766
  • 1
  • 10
  • 22
2

If you know that the Integer is not NULL, you can simply do this:

Integer intVal = 1;
Long longVal = (long) (int) intVal
Steven Spungin
  • 27,002
  • 5
  • 88
  • 78
2
new Long(Integer.longValue());

or

new Long(Integer.toString());
Pavlo Zvarych
  • 615
  • 2
  • 9
  • 13
2

If you don't know the exact class of your number (Integer, Long, Double, whatever), you can cast to Number and get your long value from it:

Object num = new Integer(6);
Long longValue = ((Number) num).longValue();
kaiser
  • 940
  • 1
  • 10
  • 25
1

A parser from int variables to the long type is included in the Integer class. Here is an example:

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

You can easily use this in-built function to create a method that parses from int to 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
  • 686
  • 1
  • 9
  • 23
1

For a nullable wrapper instance,

Integer i;
Long l = Optional.ofNullable(i)
                 .map(Long::valueOf)
                 .orElse(null);
Jin Kwon
  • 20,295
  • 14
  • 115
  • 184
1

To convert Integer into Long simply cast the Integer value

Integer intValue = 23;
Long longValue = (long) intValue;
Shedrack
  • 656
  • 7
  • 22
0

This is null-safe

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp == null ? null : tmp.longValue();
adkisson
  • 425
  • 4
  • 6
-3

In case of a List of type Long, Adding L to end of each Integer value

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

Try to convertValue by Jackson

ObjectMapper mapper = new ObjectMapper()
Integer a = 1;
Long b = mapper.convertValue(a, Long.class)
Tiago Martins Peres
  • 14,289
  • 18
  • 86
  • 145
  • 1
    This is definitely not the best answer: this solution adds unnecessary complexity, performance overhead and requires an extra library (Jackson) – NickGreen May 20 '20 at 12:34