Начиная с 27 марта 2025 г. мы рекомендуем использовать android-latest-release
вместо aosp-main
для создания и участия в AOSP. Дополнительные сведения см. в разделе Изменения в AOSP .
Безопасный союз
Оптимизируйте свои подборки
Сохраняйте и классифицируйте контент в соответствии со своими настройками.
safe_union
в HIDL представляет явно помеченный тип union. Это похоже на union
, за исключением того, что safe_union
отслеживает базовый тип и совместим с Java. Тип safe_union
доступен в Android 10 и выше для новых и обновленных устройств.
Синтаксис
safe_union
выражается в HIDL точно так же, как union
или struct
.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};
Использование
Во время выполнения safe_union
всегда имеет только один тип. По умолчанию это первый тип в объединении. Например, выше MySafeUnion
по умолчанию имеет TypeA
.
hidl-gen
генерирует пользовательский класс или структуру для safe_union
как в C++, так и в Java. Этот класс включает дискриминатор для каждого члена (в hidl_discriminator
), метод для получения текущего дискриминатора ( getDiscriminator
), а также сеттеры и геттеры для каждого члена. Каждый сеттер и геттер названы точно так же, как и его член. Например, геттер для TypeA a
называется "a" и возвращает что-то из TypeA
. Соответствующий сеттер также называется "a" и принимает параметр TypeA
. Установка значения в safe_union
обновляет значение дискриминатора, возвращаемое getDiscriminator
. Доступ к значению из дискриминатора, который не является текущим дискриминатором, прерывает программу. Например, если вызов getDiscriminator
для экземпляра MySafeUnion
возвращает hidl_discriminator::b
, то попытка извлечь a
прерывает программу.
Моногосударство
safe_union
всегда имеет значение, но если желательно, чтобы оно не имело значения, используйте android.hidl.safe_union@1.0::Monostate
в качестве заполнителя. Например, следующее union может быть либо noinit
(пустым), либо foo
:
import android.hidl.safe_union@1.0::Monostate;
safe_union OptionalFoo {
Monostate noinit;
Foo foo;
};
Контент и образцы кода на этой странице предоставлены по лицензиям. Java и OpenJDK – это зарегистрированные товарные знаки корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2025-07-29 UTC.
[[["Прост для понимания","easyToUnderstand","thumb-up"],["Помог мне решить мою проблему","solvedMyProblem","thumb-up"],["Другое","otherUp","thumb-up"]],[["Отсутствует нужная мне информация","missingTheInformationINeed","thumb-down"],["Слишком сложен/слишком много шагов","tooComplicatedTooManySteps","thumb-down"],["Устарел","outOfDate","thumb-down"],["Проблема с переводом текста","translationIssue","thumb-down"],["Проблемы образцов/кода","samplesCodeIssue","thumb-down"],["Другое","otherDown","thumb-down"]],["Последнее обновление: 2025-07-29 UTC."],[],[],null,["# Safe union\n\n`safe_union` in HIDL represents an explicitly tagged union type.\nThis is similar to a `union` except `safe_union` keeps\ntrack of the underlying type and is compatible with Java. The\n`safe_union` type is available in Android 10\nand higher for new and upgraded devices.\n\nSyntax\n------\n\nA `safe_union` is expressed in HIDL exactly like a\n`union` or `struct`. \n\n```scdoc\nsafe_union MySafeUnion {\n TypeA a;\n TypeB b;\n ...\n};\n```\n\nUsage\n-----\n\nAt runtime, a `safe_union` is only ever one type. By default, it's\nthe first type in the union. For instance, above,\n`MySafeUnion` is by default `TypeA`.\n\n`hidl-gen` generates a custom class or struct for a\n`safe_union` in both C++ and Java. This class includes a\ndiscriminator for each member (in `hidl_discriminator`), a method to\nget the current discriminator (`getDiscriminator`), and setters and\ngetters for each member. Each setter and getter is named exactly as its member.\nFor instance, the getter for `TypeA a` is called \"a\", and it\nreturns something of `TypeA`. The corresponding setter is also\nbe called \"a\" and takes a parameter of `TypeA`. Setting the value in\na `safe_union` updates the value of the discriminator as\nreturned by `getDiscriminator`. Accessing a value from a\ndiscriminator that isn't the current discriminator aborts the program. For\ninstance, if calling `getDiscriminator` on an instance of\n`MySafeUnion` returns `hidl_discriminator::b`, then\ntrying to retrieve `a` aborts the program.\n\nMonostate\n---------\n\nA `safe_union` always has a value, but if it is desired to not\nhave a value, use `android.hidl.safe_union@1.0::Monostate` as a\nplaceholder. For instance, the following union can either be\n`noinit` (empty) or `foo`: \n\n```python\nimport android.hidl.safe_union@1.0::Monostate;\n\nsafe_union OptionalFoo {\n Monostate noinit;\n Foo foo;\n};\n```"]]