Ответ 1
Потому что компилятор не знает, что new Circle
действителен. Рассмотрим этот код:
Base<? extends Shape> bs = new Base<Square>(); // Really a Base<Square>
bs.setX(new Circle());
(FYI, очень похожий пример приведен в учебном пособии Java по шаблонам.)
Теперь вы можете воскликнуть: "Но компилятор действительно может видеть это Base<Square>
!". Но не в общем. Рассмотрим это:
Base<? extends Shape> bs = someInterface.getBaseOfSomeKindOfShape();
bs.setX(new Circle());