Good day everyone. My problem has been discussed many times on SO, but i cant find answer anyway. So, I need to store array of generics in my generic class instance:
public class GenericArrayStorage<Item> implements Iterable<Item> {
private Item[] storage;
....
}
Obviously, I cant work with storage like with array of concrete objects (my IDE shows error Generic array creation on new Item[]). After some research i wrote this code:
@SuppressWarnings("unchecked")
public GenericArrayStorage() {
ParameterizedType genericSuperclass =
(ParameterizedType) getClass().getGenericSuperclass(); //error
Class clazz = (Class) genericSuperclass.getActualTypeArguments()[0];
storage = (Item[]) Array.newInstance(clazz, 10);
}
But this leads to following error:
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
I said OK and wrote this:
@SuppressWarnings("unchecked")
public GenericArrayStorage() {
ParameterizedType pt =
(ParameterizedType) getClass().getGenericInterfaces()[0];
Class clazz = (Class) pt.getActualTypeArguments()[0]; //error
storage = (Item[]) Array.newInstance(clazz, 10);
}
This one causes another exception: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class. Sad but true.
Then I added .getClass() to pt.getActualTypeArguments()[0] and my constructor now don't throw any errors. However, when i try to work with this array after new GenericArrayStorage<Integer>(), it throws following: java.lang.ArrayStoreException: java.lang.Integer. This line causes exception: storage[0] = new Integer(1);
So, how could i work with generic array?