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?