Thursday, August 13, 2009

Java Generics

Generics and Subtyping

List<string> ls = new ArrayList<string>(); //1 
List<Object> lo = ls; //2 This is not allowed
lo.add(new Object()); // 3
String s = ls.get(0); // 4: attempts to assign an Object to a String!


Becaue the subtyping is not allowed for generics, you cannot pass Collection<String> into the method below.

void printCollection(Collection<Object> c) {
for (Object e : c) {

So what is the supertype of all kinds of collections? It’s written Collection<?> (pronounced “collection of unknown”)

void printCollection(Collection<?> c) {
for (Object e : c) {

Collection<?> c = new ArrayList<String>();  // This is allowed

c.add(new Object()); // compile time error

c.add(new String()); // compile time error

Since we don’t know what the element type of c stands for, we cannot add objects to it.

Bounded Wildcards

public void drawAll(List<? extends Shape> shapes) { ... }

Now drawAll() will accept lists of any subclass of Shape, so we can now call it on a List<Circle> if we want. (Circle is a subclass of Shape)

static <T> void fromArrayToCollection(T[] a, Collection<T> c) { 
for (T o : a) {
c.add(o); // correct

Object[] oa = new Object[100];
Collection<Object> co = new ArrayList<Object>();
fromArrayToCollection(oa, co);// T inferred to be Object

No comments:

Post a Comment