Это не переопределение.Если бы это работало, this.toString()
все равно получал бы доступ к методу A
вместо Arrays.toString
, как это было бы в случае переопределения.
Спецификация языка объясняет, что статическийимпорт влияет только на разрешение static
методов и типов:
Одно-статическое объявление импорта d в модуле компиляции c пакета p, которое импортирует поле с именем n, затеняет объявление любого статическогополе с именем n, импортируемое объявлением static-import-on-demand в c, по всему c.
Одно-статическое объявление импорта d в модуле компиляции c пакета p, который импортирует метод с именем n с подписьюs скрывает объявление любого статического метода с именем n с подписью s, импортированного объявлением static-import-on-demand в c, по всему c.
Объявление одиночного статического импорта dв модуле компиляции c пакета p, который импортирует тип с именем n, затеняет объявления:
- any статический тип с именем n imported объявлением статического импорта по требованию в c.
- any тип верхнего уровня (§7.6) с именем n, объявленным в другом модуле компиляции (§7.3) из p.
- любой тип с именем n , импортированный с помощью объявления типа импорта по требованию (§7.5.2) в c.в течение c.
Статический импорт не скрывает нестатические методы или внутренние типы.
Таким образом, toString
не скрывает нестатический метод.Поскольку имя toString
может ссылаться на нестатический метод A
, оно не может ссылаться на static
метод Arrays
и, таким образом, toString
связывается с единственным доступным методом с именем toString
, который доступенв объеме, который составляет String toString()
.Этот метод не может принимать аргументы, поэтому вы получаете ошибку компиляции.
В разделе 15.12.1 поясняется разрешение метода, и его пришлось бы полностью переписать, чтобы разрешить дублирование недоступных имён методов внутри static
методов, но не внутри member
методов.
Я предполагаю, что разработчики языка хотели сохранить простые правила разрешения методов, что означает, что одно и то же имя означает одно и то же, независимо от того, появляется оно в методе static
или нет, и единственное, что можно изменить, - это то, что доступно.