




Потому что сервлет - это интерфейс, а не абстрактный класс. Аргументы конструктора не могут быть указаны в интерфейсе, поэтому ServletContext необходимо указать в обычной сигнатуре метода.
Это позволяет серверу приложений знать, как правильно инициализировать любую реализацию сервлета.
Другим решением было бы потребовать, но не применять во время компиляции конструктор, принимающий ServletContext. Затем сервер приложений вызовет конструктор через отражение. Однако разработчики спецификации сервлетов не пошли по этому пути.
См. мой ответ на аналогичный вопрос.