В руководстве по Java написано, что у меня может быть закрытый для пакета интерфейс, но я не могу - PullRequest
30 голосов
/ 26 января 2011

В руководстве по Java "Определение интерфейса" написано

Если вы не укажете, что интерфейс public, ваш интерфейс будет доступен только для классов, определенных в том же пакете, что и интерфейс.

Однако, это

interface PPInterface {
    void foo();
    void bar();
}

class NewClass implements PPInterface {
    void foo() {}
    void bar() {}
}

генерирует ошибки компилятора в NewClass, потому что я 'пытаюсь назначить более слабые права доступа; был публичным ». Таким образом, документация неверна, или я сделал что-то не так, или я неправильно истолковал документацию?

Полагаю, мне не нужно использовать интерфейс - мне это нравится, потому что он хорошо организован.

Ответы [ 3 ]

56 голосов
/ 26 января 2011

Сам интерфейс может быть закрытым для пакета, а не методы в нем. Вы можете определить интерфейс, который может использоваться только (по имени) в пакете, в котором он определен, но его методы public, как и все методы интерфейса. Если класс реализует этот интерфейс, методы, которые он определяет, должны быть public. Ключевым моментом здесь является то, что интерфейс тип не виден за пределами пакета, а не методы. Документы не являются неправильными, потому что использование методов, определенных в интерфейсе, отличается от использования самого интерфейса.

Также имейте в виду, что при определении интерфейса не добавляйте public до того, как определение метода ничего не изменит, поскольку все методы неявно public.

Если класс (ы), которые вы используете для реализации интерфейса, сами по себе являются пакетно-частными, то public сущность методов интерфейса, очевидно, не является проблемой. Конечно, вы могли бы также использовать абстрактный класс вместо интерфейса, если проблема единственного наследования не мешает вам:

abstract class Whatever {
  abstract void foo();
  abstract void bar();
}
4 голосов
/ 26 января 2011

Я думаю (хотя я могу ошибаться в этом), что обсуждаемые здесь более слабые привилегии доступа относятся к методам foo() и bar() в NewClass. Все методы интерфейса неявно public, но в NewClass вы оставили их закрытыми для пакета, что является более слабой гарантией, чем public. Изменение NewClass на чтение

class NewClass implements PPInterface{
    public void foo() {}
    public void bar() {}
}

вероятно исправит это.

0 голосов
/ 26 мая 2018

что помогло мне обойти проблему единственного наследования:

Вместо A расширяет B реализует C

У меня есть абстрактный D (интерфейс с защитой пакетов в C) расширяет B

и затем расширяет D

Работает нормально.Чисто тоже, чч.

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