Условие permits
Перечисляйте разрешённые подтипы
«Условие permits» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Предложение со списком разрешённых подтипов
Предложение permits указывает разрешённые подтипы запечатанного типа. Оно записывается сразу после имени типа с помощью ключевого слова permits.
Базовый синтаксис
Перечислите разрешённые подтипы через запятую после permits.
public class Main {
sealed interface Vehicle permits Car, Truck, Motorcycle {}
record Car() implements Vehicle {}
record Truck() implements Vehicle {}
record Motorcycle() implements Vehicle {}
public static void main(String[] args) {
Vehicle v = new Truck();
System.out.println(v.getClass().getSimpleName());
}
}Реализация контракта
Каждый названный подтип должен действительно использовать implements для интерфейсов или extends для классов, чтобы наследоваться от запечатанного типа. Указание в permits класса, который этого не делает, приводит к ошибке компиляции.
Пропуск списка разрешённых подтипов
Если все разрешённые подтипы объявлены в том же файле, что и запечатанный тип, предложение permits можно полностью опустить. Компилятор автоматически выводит этот список.
public class Main {
sealed interface Status {}
record Active() implements Status {}
record Inactive() implements Status {}
public static void main(String[] args) {
Status s = new Active();
System.out.println(s.getClass().getSimpleName());
}
}Когда требуется список разрешённых подтипов
Если подтипы находятся в отдельных файлах одного пакета или модуля, их необходимо явно перечислить в permits. Компилятор не может вывести список из нескольких файлов.
Порядок не имеет значения
Порядок имён в permits не имеет смыслового значения. Он не влияет на поведение оператора выбора или что-либо ещё — это всего лишь список разрешённых типов.
Иерархия классов с разрешёнными подтипами
Это же предложение работает для запечатанных классов с абстрактным поведением.
public class Main {
sealed static abstract class Node permits Leaf, Branch {
abstract int size();
}
static final class Leaf extends Node {
int size() { return 1; }
}
static final class Branch extends Node {
final Node a, b;
Branch(Node a, Node b) { this.a = a; this.b = b; }
int size() { return a.size() + b.size(); }
}
public static void main(String[] args) {
Node tree = new Branch(new Leaf(), new Branch(new Leaf(), new Leaf()));
System.out.println("Leaves: " + tree.size());
}
}Забытый подтип
Если класс реализует запечатанный интерфейс, но отсутствует в permits, компиляция завершается ошибкой с сообщением о том, что этому классу нельзя наследоваться от запечатанного типа.
Разрешённые типы — общедоступные сведения
Список permits является частью контракта типа и записывается в файл класса. Инструменты и компилятор могут прочитать его, чтобы узнать полный набор подтипов.
Сочетание конечных и запечатанных дочерних типов
Список permits может сочетать разные модификаторы: одни дочерние типы могут быть final, а другие — sealed, чтобы продолжить иерархию.
public class Main {
sealed interface Shape permits Circle, Polygon {}
record Circle(double r) implements Shape {}
sealed interface Polygon extends Shape permits Triangle, Rectangle {}
record Triangle() implements Polygon {}
record Rectangle() implements Polygon {}
public static void main(String[] args) {
Shape s = new Triangle();
System.out.println(s instanceof Polygon);
}
}Рекомендации
Для удобства чтения держите запечатанный тип и его подтипы рядом. В небольших иерархиях в одном файле лучше не указывать permits, а при разделении кода по файлам перечисляйте подтипы явно.
Быстрая проверка
Проверьте своё понимание предложения permits.
Итоги
Вы изучили предложение permits.
- Оно перечисляет разрешённые подтипы после имени запечатанного типа.
- Каждый перечисленный тип должен наследоваться от запечатанного типа или реализовывать его.
- Его можно опустить, если все подтипы находятся в одном файле.
- Подтипы сами могут быть запечатанными, чтобы продолжить иерархию.
Часто задаваемые вопросы
Урок «Условие permits» бесплатный?
Да — полный текст урока «Условие permits» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Условие permits»?
Перечисляйте разрешённые подтипы Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Условие permits»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Объявление запечатанных типов
- Условие permits
- Запечатанные типы с record
- Полный switch по запечатанному типу