Учебник Java говорит, что у меня может быть пакет-частный интерфейс, но я не могу
В учебном пособии Java "Определение интерфейса" говорится:
Если вы не укажете, что интерфейс public
, ваш интерфейс будет доступен только для классов, определенных в том же пакете, что и интерфейс.
Однако этот
interface PPInterface {
void foo();
void bar();
}
class NewClass implements PPInterface {
void foo() {}
void bar() {}
}
генерирует ошибки компилятора в NewClass
, потому что я пытаюсь назначить более слабые права доступа; был публичным ". Итак, документация неверна, или я сделал что-то неправильно, или я неверно истолковал документацию?
Я полагаю, что мне не нужно использовать интерфейс - мне это нравится, потому что он прекрасно организован.
Ответы
Ответ 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() {}
}
вероятно, исправит это.