Подтвердить что ты не робот

Учебник Java говорит, что у меня может быть пакет-частный интерфейс, но я не могу

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

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

Однако этот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

abstract class Whatever {
  abstract void foo();
  abstract void bar();
}

Ответ 2

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

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

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