JackSun
JackSun

Reputation: 1478

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

I need convert HashMap to a String array, follow is my java code

import java.util.HashMap;
import java.util.Map;

public class demo {

    public static void main(String[] args) {

        Map<String, String> map1 = new HashMap<String, String>();

        map1.put("1", "1");
        map1.put("2", "2");
        map1.put("3", "3");

        String[] str = (String[]) map1.keySet().toArray();

        for(int i=0; i<str.length;i++) {
            System.out.println(str[i]);
        }
    }
}

when I run the code, I get the following ClassCastException.

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at demo.main(demo.java:17)

Upvotes: 33

Views: 148373

Answers (4)

Muhammed_G
Muhammed_G

Reputation: 492

You can cast Object[] to String[] like this:

String[] str = map1.keySet().toArray(String[]::new);

Upvotes: 2

Mureinik
Mureinik

Reputation: 311393

toArray() returns an Object[], regardless of generics. You could use the overloaded variant instead:

String[] str = map1.keySet().toArray(new String[map1.size()]);

Alternatively, since a Set's toArray method gives no guarantee about the order, and all you're using the array for is printing out the values, you could iterate the keySet() directly:

for (String str: map1.keySet()) {
    System.out.println(str);
}

EDIT: Just to complete the picture, in Java 8, the foreach method can be used to make the code more elegant:

map1.keySet().forEach(System.out::println);

Upvotes: 48

Mr.Q
Mr.Q

Reputation: 4524

toArray()method is defined in List interface so every where there is an instance of List, you also have access to this method.

At first you might think that you can cast an array of Objects which its elements are all of type String to a String array but java specs says otherwise Link, in short it says:

bArr = new B[]; A[] aArr = (A[]) bArr;

"works" at runtime if and only if B is a subtype of A (or A itself). Whether B actually only contains As is irrelevant and the compile-time type of bArr is not used either (what matters is the runtime type):

In your code by calling : image_urls.toArray() you will get an array of Object and since Object is not SubType of String, you get exception. To do this write, use other overload of toArray() which gets an array of certain type (for type reference) as "Mureinik" mentioned.

Upvotes: 2

Sabuj Hassan
Sabuj Hassan

Reputation: 39365

It is returning Object[] Not String[]. Try this:

Object[] obj = (Object[]) map1.keySet().toArray();
for(int i=0; i<obj.length;i++) {
    String someString = (String)obj[i];
    System.out.println(someString);
}

Upvotes: 5

Related Questions