Reputation: 51138
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
Upvotes: 2
Views: 27069
Reputation: 384016
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[]
.
<E extends Number>
and <Number>
?Upvotes: 4
Reputation: 7061
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);
}
}
Upvotes: 10