Как использовать импорт stati c для java .util.Arrays.toString? - PullRequest
2 голосов
/ 04 мая 2020

Рассмотрим следующие два простых фрагмента кода java:

import java.util.Arrays;
class Okay {
    public static void main(String... args) {
        System.out.println(Arrays.toString(new int[0]));
    }
}

Это отлично работает. Но если я часто использую toString, у меня может возникнуть соблазн использовать импорт stati c, например:

import static java.util.Arrays.toString;
class DoesNotCompile {
    public static void main(String... args) {
        System.out.println(toString(new int[0]));
    }
}

Если я попробую это, Java подумает, что я пытаюсь вызвать toString () из Object, а затем жалуется, что toString не принимает аргументов. Это кажется глупым: я использую метод stati c, так что toString даже не следует рассматривать. (Даже в методе экземпляра я считаю, что Java должен получить здесь правильный ответ.)

Есть ли способ исправить это, или импорт stati c просто не работает, если это имя уже "занято"?

1 Ответ

2 голосов
/ 04 мая 2020

Нет, этого не избежать.

[Из JLS 15.12, Выражения вызова метода] (https://docs.oracle.com/javase/specs/jls/se14/html/jls-15.html#jls -15,12 ) (более конкретно, из 15.12.1, «Определить класс или интерфейс для поиска ")

  • Если форма - имя метода, то есть просто идентификатор, то:

    Если идентификатор появляется в области объявление метода с этим именем (§6.3, §6.4.1), затем:

    • Если есть объявление включающего типа, членом которого является этот метод, пусть T будет самым внутренним такое объявление типа. Класс или интерфейс для поиска - T.

      Эта политика поиска называется «правилом гребенки». Он эффективно ищет методы в иерархии суперкласса вложенного класса перед поиском методов во включающем классе и его иерархии суперкласса. См. Пример в §6.5.7.1.

    • В противном случае объявление метода может находиться в области действия из-за одного или нескольких single-stati c -import или stati c -объявления на импорт. Класс или интерфейс для поиска отсутствуют, поскольку вызываемый метод определяется позже (§15.12.2.1).

Итак, " local "всегда будет соответствовать перед импортом stati c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...