为什么
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
}
}
Run Code Online (Sandbox Code Playgroud)
给出编译器错误
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());
}
}
Run Code Online (Sandbox Code Playgroud)
和
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());
}
}
Run Code Online (Sandbox Code Playgroud)
和
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());
}
}
Run Code Online (Sandbox Code Playgroud)
编译好.
或者更确切地说,为什么bar.getFoos()返回List<Object>而不是List<Foo<?>>父实例是泛型类的原始类型?