A partire dal 27 marzo 2025, ti consigliamo di utilizzare android-latest-release
anziché aosp-main
per compilare e contribuire ad AOSP. Per ulteriori informazioni, vedi Modifiche ad AOSP.
Unione sicura
Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
safe_union
in HIDL rappresenta un tipo di unione con tag esplicito.
È simile a un union
, tranne per il fatto che safe_union
tiene traccia del tipo sottostante ed è compatibile con Java. Il tipo safe_union
è disponibile in Android 10 e versioni successive per i dispositivi nuovi e di cui è stato eseguito l'upgrade.
Sintassi
Un safe_union
viene espresso in HIDL esattamente come un
union
o un struct
.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};
Utilizzo
In fase di esecuzione, un safe_union
è sempre di un solo tipo. Per impostazione predefinita, è il primo tipo nell'unione. Ad esempio, sopra,
MySafeUnion
è per impostazione predefinita TypeA
.
hidl-gen
genera una classe o una struttura personalizzata per un
safe_union
sia in C++ che in Java. Questa classe include un
discriminatore per ogni membro (in hidl_discriminator
), un metodo per
ottenere il discriminatore corrente (getDiscriminator
) e setter e
getter per ogni membro. Ogni setter e getter è denominato esattamente come il relativo membro.
Ad esempio, il getter per TypeA a
si chiama "a" e
restituisce qualcosa di TypeA
. Il relativo setter può anche essere chiamato "a" e accetta un parametro TypeA
. L'impostazione del valore in
safe_union
aggiorna il valore del discriminatore come
restituito da getDiscriminator
. L'accesso a un valore da un
discriminatore diverso da quello corrente interrompe il programma. Ad esempio, se la chiamata a getDiscriminator
su un'istanza di MySafeUnion
restituisce hidl_discriminator::b
, il tentativo di recuperare a
interrompe il programma.
Monostato
Un safe_union
ha sempre un valore, ma se non vuoi che ne abbia uno, utilizza android.hidl.safe_union@1.0::Monostate
come segnaposto. Ad esempio, la seguente unione può essere
noinit
(vuoto) o foo
:
import android.hidl.safe_union@1.0::Monostate;
safe_union OptionalFoo {
Monostate noinit;
Foo foo;
};
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-07-27 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 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```"]]