Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java list of objects that all implement an interface

Tags:

java

generics

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?

like image 911
Gerard Avatar asked Sep 22 '09 15:09

Gerard


4 Answers

What about:

List<? extends IA> list;
like image 189
OscarRyz Avatar answered Oct 13 '22 16:10

OscarRyz


You can do it with extends:

List<? extends IA> list
like image 45
bruno conde Avatar answered Oct 13 '22 16:10

bruno conde


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.

like image 20
coobird Avatar answered Oct 13 '22 15:10

coobird


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 As, but are guaranteeing that they are IAs, 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 As. The reason for this is explained in Java's tutorial on generics.

like image 3
Paul Brinkley Avatar answered Oct 13 '22 16:10

Paul Brinkley