From Effective Java 2/e by Joshua Bloch
Arrays v/s Generic type
Arrays (covariant) v/s Generic type (invariant)
- If Sub is a subtype of Super, then the array type Sub[] is a subtype of Super[]
- For any two distinct types Type1 and Type2, List<Type1> is neither a subtype nor a supertype of List<Type2>
// Fails at runtime! Object[] objectArray = new Long[1]; objectArray[0] = "I don't fit in"; // Throws ArrayStoreException
// Won't compile! List<Object> ol = new ArrayList<Long>(); // Incompatible types ol.add("I don't fit in");
Arrays (reification) v/s Generic type (erasure)
- Arrays know and enforce their element types at runtime
- Generic enforce their type constraints only at compile time and discard (or erase) their element type information at runtime
arrays and generics do not mix well
new List<E>[] new List<String>[] new E[]
// List-based generic reduction static <E> E reduce(List<E> list, Function<E> f, E initVal) { List<E> snapshot; synchronized(list) { snapshot = new ArrayList<E>(list); } E result = initVal; for (E e : snapshot) result = f.apply(result, e); return result; }