views:

128

answers:

2

I want to pass some ArrayList<Integer> X into method a(Collection<Integer> someCol) that takes Collection<Integer> as an input.

How can I do this? I thought an ArrayList was a Collection and thus I should be able to "just do it" but it seems that Collection is an interface and ArrayList implements this interface. Is there something I can do to make this work ... if you understand the theory that would also help me and possibly lots of other people.

Thanks

+6  A: 

Just do it.

Seriously, a class will implicitly cast to an interface for which it implements.

Edit
In case you needed an example:

import java.util.*;

public class Sandbox {
    public static void main(String[] args) {
        final ArrayList<Integer> list = new ArrayList<Integer>(5);
        Collections.addAll(list, 1, 2, 3, 4, 5);
        printAll(list);
    }

    private static void printAll(Collection<Integer> collection) {
        for (Integer num : collection)
            System.out.println(num);
    }
}
Gunslinger47
+2  A: 

class ArrayList<E> implements List<E> and interface List<E> extends Collection<E>, so an ArrayList<Integer> is-a Collection<Integer>.

This is what is called "subtyping".

Note, however, that even though Integer extends Number, a List<Integer> is-not-a List<Number>. It is, however, a List<? extends Number>. That is, generics in Java is invariant; it's not covariant.

Arrays on the other hand, are covariant. An Integer[] is-a Number[].

References

Related questions

polygenelubricants
This is a pretty awesome answer, thanks for taking the time to write it up and link to everything.
R0MANARMY