1. Introduction

ClassCastException is a runtime exception raised in Java when we try to improperly cast a class from one type to another. It’s thrown to indicate that the code has attempted to cast an object to a related class, but of which it is not an instance.

For a more in-depth introduction to exceptions in Java, take a look here.

2. ClassCastException Details

First, let’s take a look at a simple example. Consider the following code snippet:

String[] strArray = new String[] { "John", "Snow" };
ArrayList<String> strList = (ArrayList<String>) Arrays.asList(strArray);
System.out.println("String list: " + strList);

The above code causes ClassCastException where we cast the return value of Arrays.asList(strArray) to an ArrayList.

The reason is that although the static method Arrays.asList() returns a List, we don’t know until runtime exactly what implementation is returned. So at compile time the compiler can’t know either and allows the cast*.*

When the code runs, the actual implementation is checked which finds that Arrays.asList() returns an Arrays$List thus causing a ClassCastException.

3. Resolution

We can simply declare our ArrayList as a List to avoid this exception:

List<String> strList = Arrays.asList(strArray);
System.out.println("String list: " + strList);

However, by declaring our reference as a List we can assign any class that implements the List interface, including the Arrays$ArrayList returned by the method call.

4. Summary

In this article, we’ve seen the explanation of what exactly is a ClassCastException and what measures we have to take this fix this issue.

The full code can be found over on GitHub.


» 下一篇: Spring泛型自动装配