Item 25 - Prefer lists to arrays
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;
}