Используйте это вместо:
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 }
Как только вы объявляете foos как List<? extends Foo>
, компилятор не знает, что безопасно добавлять SubFoo. Что, если ArrayList<AltFoo>
было присвоено foos
? Это будет действительное назначение, но добавление SubFoo будет загрязнять коллекцию.