Why does
class Foo<T> {
}
class Bar<T> {
   List<Foo<?>> getFoos() {
      return null;
   }
}
class Baz {
   void baz(Bar bar) {
      for (Foo foo : bar.getFoos()); 
//                              ^
//error: incompatible types: Object cannot be converted to Foo
   }
}
give a compiler error while
class Foo<T> {
}
// changed Bar<T> to Bar
class Bar {
   List<Foo<?>> getFoos() {
      return null;
   }
}
class Baz {
   void baz(Bar bar) {
      for (Foo foo : bar.getFoos());
   }
}
and
class Foo<T> {
}
class Bar<T> {
   List<Foo<?>> getFoos() {
      return null;
   }
}
class Baz {
   // changed Bar to Bar<?>
   void baz(Bar<?> bar) {
      for (Foo foo : bar.getFoos());
   }
}
and
class Foo<T> {
}
class Bar<T> {
   List<Foo<?>> getFoos() {
      return null;
   }
}
class Baz {
   void baz(Bar bar) {
      // changed Foo to Object
      for (Object foo : bar.getFoos());
   }
}
compile fine.
Or rather why does bar.getFoos() return List<Object> and not List<Foo<?>> if the parent instance is a raw type of a generic class?
 
    