问题 Consider this case: class A {} class B<T extends A, E extends T> { B<?, A> b; B<?, ? extends A> b2; } As I understand type bounds, in this case effective upper bounds of both T and E is class A . So the question: why javac doesn't accept class A as argument in declaration of field b , but accepts wildcard ? extends A in declaration of field b2 ? 回答1: With the following classes: class A {} class C extends A {} class B<T extends A, E extends T> {} Think of it like this: E extends T extends A