tags:

views:

333

answers:

2

I get this exception when i try to cast an Object array to a Long array.

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Long;

My keys in my hotelRooms map are Long, why it is not possible to cast. Does someone know how to solve this.

public class ObjectArrayToLongArrayTest {

private Map<Long, String[]> hotelRooms;

public static void main(String[] args) {

    ObjectArrayToLongArrayTest objectArrayToLongArrayTest =
        new ObjectArrayToLongArrayTest();
    objectArrayToLongArrayTest.start();
    objectArrayToLongArrayTest.findByCriteria(null);

}

private void start() {
    hotelRooms = new HashMap<Long, String[]>();
    // TODO insert here some test data.

    hotelRooms.put(new Long(1), new String[] {
            "best resort", "rotterdam", "2", "y", "129", "12-12-2008",
            "11111111"
    });

    hotelRooms.put(new Long(2), new String[] {
            "hilton", "amsterdam", "4", "n", "350", "12-12-2009", "2222222"
    });

    hotelRooms.put(new Long(3), new String[] {
            "golden tulip", "amsterdam", "2", "n", "120", "12-09-2009",
            null
    });
}

public long[] findByCriteria(String[] criteria) {

    Long[] returnValues;

    System.out.println("key of the hotelRoom Map" + hotelRooms.keySet());
    if (criteria == null) {
        returnValues = (Long[]) hotelRooms.keySet().toArray();
    }

    return null;
}
}   
+7  A: 

change

returnValues = (Long[]) hotelRooms.keySet().toArray();

to

returnValues = hotelRooms.keySet().toArray(new Long[hotelRooms.size()]);

and let me know if it works :-)

moritz
+1 for the *let me know if it works* ..
OscarRyz
thanks, it works. In the java api of Interface Set<E>. I see these two methods (1) Object[] toArray() and (2) <T> T[] toArray(T[] a). Why does the first method not work.
loudiyimo
the first one works just fine, but it returns an array of generic objects, which is not what you want!
moritz
+2  A: 

It's because Object[] Set.toArray() returns an object array. You can't downcast the array to a more specific type. Use <T> T[]Set.toArray(T[] a) instead. If the generic type method didn't exist you'd have to loop through each of the Objects in the return object array and cast each individually into a new Long array.

Jeremy Raymond
You saved me a lot of trouble: I had to do a lot of searching through incorrect answers before I found this gem. Thank you!
PP
Glad to be of assistance =)
Jeremy Raymond