How do I pass an ArrayList to method that takes a collection as an input
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
- What is the difference between
<E extends Number>
and<Number>
? - Covariance and contravariance in programming languages
- What is the purpose of interfaces? [closed]
- Why doesn’t Java Map extends Collection?
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, 2020Comments
-
Ankur about 4 years
I want to pass some
ArrayList<Integer>
X into methoda(Collection<Integer> someCol)
that takesCollection<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