Integer i = theLong != null ? theLong.intValue() : null;
or if you don't need to worry about null:
// auto-unboxing does not go from Long to int directly, so
Integer i = (int) (long) theLong;
And in both situations, you might run into overflows (because a Long can store a wider range than an Integer).
Java 8 has a helper method that checks for overflow (you get an exception in that case):
Integer i = theLong == null ? null : Math.toIntExact(theLong);
Answer from Thilo on Stack OverflowInteger i = theLong != null ? theLong.intValue() : null;
or if you don't need to worry about null:
// auto-unboxing does not go from Long to int directly, so
Integer i = (int) (long) theLong;
And in both situations, you might run into overflows (because a Long can store a wider range than an Integer).
Java 8 has a helper method that checks for overflow (you get an exception in that case):
Integer i = theLong == null ? null : Math.toIntExact(theLong);
Here are three ways to do it:
Long l = 123L;
Integer correctButComplicated = Integer.valueOf(l.intValue());
Integer withBoxing = l.intValue();
Integer terrible = (int) (long) l;
All three versions generate almost identical byte code:
0 ldc2_w <Long 123> [17]
3 invokestatic java.lang.Long.valueOf(long) : java.lang.Long [19]
6 astore_1 [l]
// first
7 aload_1 [l]
8 invokevirtual java.lang.Long.intValue() : int [25]
11 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [29]
14 astore_2 [correctButComplicated]
// second
15 aload_1 [l]
16 invokevirtual java.lang.Long.intValue() : int [25]
19 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [29]
22 astore_3 [withBoxing]
// third
23 aload_1 [l]
// here's the difference:
24 invokevirtual java.lang.Long.longValue() : long [34]
27 l2i
28 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [29]
31 astore 4 [terrible]
Simply:
Integer i = 7;
Long l = new Long(i);
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...
What are the main methods to convert an Integer to a Long in Java?
What is autoboxing in the context of Integer to Long conversion?
Which method is the most efficient for Integer to Long conversion?
According to the JLS for Java 8 this should not happen:
5.1.2. Widening Primitive Conversion
19 specific conversions on primitive types are called the widening primitive conversions:
[..]
- int to long, float, or double
[..]
5.1.8. Unboxing Conversion
[..]
- From type Integer to type int
What should happen is an unboxing from Integer to int, and then a widening conversion to long. This is actually happening as expected in Oracle JDK (1.8.0.25).
I believe you came across a compiler bug into your JDK. You should probably try an updated version or file a bug with the maintainers.
A known Eclipse bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=440019
Fixed in Eclipse 4.5 M3.
Note that there is a difference between a cast to long and a cast to Long. If you cast to long (a primitive value) then it should be automatically boxed to a Long (the reference type that wraps it).
You could alternatively use new to create an instance of Long, initializing it with the int value.
Use the following: Long.valueOf(int);.