Reputation: 609
I'm supposed to receive long integer in my web service.
long ipInt = (long) obj.get("ipInt");
When I test my program and put ipInt value = 2886872928, it give me success. However, when I test my program and put ipInt value = 167844168, it give me error :
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
The error is point to the above code.
FYI, my data is in JSON format :
{
"uuID": "user001",
"ipInt": 16744168,
"latiTude": 0,
"longiTude": 0,
}
Is there any suggestion so that I can ensure my code able to receive both ipInteger value?
Upvotes: 38
Views: 81402
Reputation: 2479
in kotlin I simply use this:
val myInt: Int = 10
val myLong = myInt.toLong()
Upvotes: 2
Reputation: 41
public static void main(String[] args) {
JSONObject jo = JSON.parseObject(
"{ \"uuID\": \"user001\", \"ipInt\": 16744168, \"latiTude\": 0, \"longiTude\": 0}");
System.out.println(jo);
long sellerId1 = Long.valueOf(jo.get("ipInt").toString());
//Long sellerId1 = (long)jo.get("ipInt");
System.out.println(sellerId1);
}
Upvotes: 0
Reputation: 3107
We don't know what obj.get()
returns so it's hard to say precisely, but when I use such methods that return Number
subclasses, I find it safer to cast it to Number
and call the appropriate xxxValue()
, rather than letting the auto-unboxing throw the ClassCastException
:
long ipInt = ((Number)obj.get("ipInt")).longValue();
That way, you're doing explicit unboxing to a long
, and are able to cope with data that could include a .
, which would return a Float
or Double
instead.
Upvotes: 9
Reputation: 201497
You mention the current approach works when you provide a value outside the range of integer, but fails when you are within the integer range. That is an odd behavior for an API, because it seems you need to check the return type yourself. You can do that. The usual way is with instanceof
. Something like,
long ipInt;
Object o = obj.get("ipInt");
if (o instanceof Integer) {
ipInt = ((Integer) o).intValue();
} else if (o instanceof Long) {
ipInt = ((Long) o).longValue();
}
Upvotes: 0
Reputation: 1502376
Both Integer
and Long
are subclasses of Number
, so I suspect you can use:
long ipInt = ((Number) obj.get("ipInt")).longValue();
That should work whether the value returned by obj.get("ipInt")
is an Integer
reference or a Long
reference. It has the downside that it will also silently continue if ipInt
has been specified as a floating point number (e.g. "ipInt": 1.5
) in the JSON, where you might want to throw an exception instead.
You could use instanceof
instead to check for Long
and Integer
specifically, but it would be pretty ugly.
Upvotes: 60