Use this instead:
1 public List<? extends Foo> getFoos()
2 {
3 List<Foo> foos = new ArrayList<Foo>(); /* Or List<SubFoo> */
4 foos.add(new SubFoo());
5 return foos;
6 }
Once you declare foos as List<? extends Foo>
, the compiler doesn’t know that it’s safe to add a SubFoo. What if an ArrayList<AltFoo>
had been assigned to foos
? That would be a valid assignment, but adding a SubFoo would pollute the collection.