À partir du 27 mars 2025, nous vous recommandons d'utiliser android-latest-release
au lieu de aosp-main
pour créer et contribuer à AOSP. Pour en savoir plus, consultez la section Modifications apportées à AOSP.
Syndicat sécurisé
Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
safe_union
dans HIDL représente un type d'union tagué explicitement.
Cette méthode est semblable à une union
, à l'exception de safe_union
, qui suit le type sous-jacent et est compatible avec Java. Le type safe_union
est disponible dans Android 10 et versions ultérieures pour les appareils neufs et mis à niveau.
Syntaxe
Un safe_union
est exprimé en HIDL exactement comme un union
ou un struct
.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};
Utilisation
Au moment de l'exécution, un safe_union
n'est jamais qu'un seul type. Par défaut, il s'agit du premier type de l'union. Par exemple, ci-dessus, MySafeUnion
est par défaut TypeA
.
hidl-gen
génère une classe ou une structure personnalisée pour un safe_union
en C++ et en Java. Cette classe inclut un discriminateur pour chaque membre (dans hidl_discriminator
), une méthode permettant d'obtenir le discriminateur actuel (getDiscriminator
), ainsi que des setters et des getters pour chaque membre. Chaque setter et getter est nommé exactement comme son membre.
Par exemple, le getter de TypeA a
est appelé "a" et renvoie un élément de TypeA
. Le "setter" correspondant peut également être appelé "a" et accepte un paramètre TypeA
. Définir la valeur dans un safe_union
met à jour la valeur du discriminateur telle qu'elle est renvoyée par getDiscriminator
. L'accès à une valeur à partir d'un discriminateur qui n'est pas le discriminateur actuel interrompt le programme. Par exemple, si l'appel de getDiscriminator
sur une instance de MySafeUnion
renvoie hidl_discriminator::b
, la tentative de récupération de a
interrompt le programme.
Monostate
Un safe_union
a toujours une valeur, mais si vous ne souhaitez pas en avoir, utilisez android.hidl.safe_union@1.0::Monostate
comme espace réservé. Par exemple, l'union suivante peut être noinit
(vide) ou foo
:
import android.hidl.safe_union@1.0::Monostate;
safe_union OptionalFoo {
Monostate noinit;
Foo foo;
};
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/07/27 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/07/27 (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```"]]