0Pricing
Java Academy · Урок

Условие 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 — локальная установка не требуется.

Все уроки этого курса

  1. Объявление запечатанных типов
  2. Условие permits
  3. Запечатанные типы с record
  4. Полный switch по запечатанному типу
← Назад к Java Academy