Can Arrays Hold Generic Items?
Generic types and arrays can interact differently in Java. Consider the following code:
<code class="java">ArrayList<Key> a = new ArrayList<Key>();</code>
This code compiles successfully, creating a generic ArrayList named a. However, the following code fails to compile:
<code class="java">ArrayList<Key>[] a = new ArrayList<Key>[10];</code>
Why is this? It appears that arrays and generics are incompatible. To understand this, let's explore Type Erasure in Java.
Type Erasure: Behind the Scenes
When Java compiles, it performs Type Erasure, which replaces generic type information with raw types (Object). This prevents errors like placing a String into an ArrayList of Integers. However, arrays require a raw type, and generics cannot be represented as raw types.
Fixing the Array Issue
To create an array of generic items, you can explicitly cast the array to the desired type:
<code class="java">ArrayList<Key>[] a = (ArrayList<Key>[]) new ArrayList[10];</code>
This cast instructs the compiler that the array should be considered an array of ArrayLists with Key elements.
List of Lists: The Exception
In Java, a list of lists is not considered an array. Hence, the following code compiles without type casting:
<code class="java">ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();</code>
This distinction arises because ArrayList is a non-array type.
Conclusion
Arrays and generic types have limitations in Java due to Type Erasure. However, by explicitly casting arrays to the desired generic type or using lists of lists, one can navigate these limitations and effectively use generic types in both contexts.
The above is the detailed content of Why Can't Arrays Hold Generic Items in Java?. For more information, please follow other related articles on the PHP Chinese website!