Suppose I have a class that implements an interface:
public class A implements IB
and I have a List<A>
that I would like to reference to: List<? implements IB> list
.
So that I can code: for (IB item : list)
etc.
Can it be done somehow in Java? There is no <? implements ...>
possibility.
What am I missing?
What about:
List<? extends IA> list;
You can do it with extends
:
List<? extends IA> list
Use extends
:
public void someMethod(List<? extends IB> list) {
for (IB e : list) {
// Perform some processing on each element.
}
}
public void anotherMethod() {
List<A> list = new ArrayList<A>();
someMethod(list);
}
More information can be found at The Java Tutorials which has a comprehensive lesson on Generics.
In particular, the section on wildcards explains how to use the ?
with super
and extends
to specify a parameter to be one that is a superclass or subclass of a given class.
If you meant that class A implements IA, rather than IB, then your code should be just fine saying
for (A item : list) {
// handle item as if it is an IA
}
since all As are, by definition IAs.
Meanwhile, there is no wildcard for <? implements C>
. There is <? extends C>
, and C
can be an interface or a class; however, this isn't necessary for what you seem to be trying to do.
If you want expressly to say for (IA item : list)
because you're not guaranteeing that items in that list are A
s, but are guaranteeing that they are IA
s, then I think you have a slight problem (I can't tell for sure, since you didn't say where this list processing code is located). A List<A>
is not a List<IA>
by definition; if you're building a List<A>
and then passing it to a method that expects a List<IA>
, you'll get a compile time error. You can, however, create a List<IA>
and fill it with A
s. The reason for this is explained in Java's tutorial on generics.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With