How do I pass an ArrayList to method that takes a collection as an input

26,483

Solution 1

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);
    }
}

Solution 2

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

Share:
26,483
Ankur
Author by

Ankur

A junior BA have some experience in the financial services industry. I do programming for my own personal projects hence the questions might sound trivial.

Updated on May 06, 2020

Comments

  • Ankur
    Ankur about 4 years

    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