Со следующими классами:
class A {}
class C extends A {}
class B<T extends A, E extends T> {}
Думайте об этом так:
E extends T extends A
С B<?,A>
, затем T -> ?
и E -> A
A extends ? extends A
Где ?
может быть любым подклассом A
, скажем, C
.
A extends C extends A
явно недопустим.
Так вот почему это ошибка компиляции.
Примечание для пользователей Eclipse:
Компилятор Eclipse 4.9.0 не согласился с javac 8u и Intellij и не выдал ошибку компиляции для обобщенных аргументов в B<?,A>
.Я предполагаю, что это ошибка в компиляторе Eclipse, но я не обращался к JLS, чтобы подтвердить это.
class B<T extends A, E extends T> {
B<?, A> b; // <-- Eclipse does NOT emit a compile error
B<?, ? extends A> b2;
}
Об этой предполагаемой ошибке сообщалось здесь .