javacastingunboxing

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


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?


Solution

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