A partir del 27 de marzo de 2025, te recomendamos que uses android-latest-release
en lugar de aosp-main
para compilar y contribuir a AOSP. Para obtener más información, consulta Cambios en AOSP.
Safe union
Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
safe_union
en HIDL representa un tipo de unión etiquetado explícitamente.
Esto es similar a un union
, excepto que safe_union
realiza un seguimiento del tipo subyacente y es compatible con Java. El tipo safe_union
está disponible en Android 10 y versiones posteriores para dispositivos nuevos y actualizados.
Sintaxis
Un safe_union
se expresa en HIDL exactamente como un union
o struct
.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};
Uso
Durante el tiempo de ejecución, un safe_union
siempre es de un solo tipo. De forma predeterminada, es el primer tipo de la unión. Por ejemplo, arriba, MySafeUnion
es TypeA
de forma predeterminada.
hidl-gen
genera una clase o una estructura personalizadas para un safe_union
en C++ y Java. Esta clase incluye un discriminador para cada miembro (en hidl_discriminator
), un método para obtener el discriminador actual (getDiscriminator
), y set y get para cada miembro. Cada set y get se nombra exactamente como su miembro.
Por ejemplo, el método get de TypeA a
se llama “a” y muestra algo de TypeA
. El set correspondiente también se llama "a" y toma un parámetro de TypeA
. Establecer el valor en un safe_union
actualiza el valor del discriminador como lo muestra getDiscriminator
. Si accedes a un valor desde un discriminador que no es el discriminador actual, se aborta el programa. Por ejemplo, si llamar a getDiscriminator
en una instancia de MySafeUnion
muestra hidl_discriminator::b
, intentar recuperar a
aborta el programa.
Monoestado
Un safe_union
siempre tiene un valor, pero si no se desea tener un valor, usa android.hidl.safe_union@1.0::Monostate
como marcador de posición. Por ejemplo, la siguiente unión puede ser noinit
(vacía) o foo
:
import android.hidl.safe_union@1.0::Monostate;
safe_union OptionalFoo {
Monostate noinit;
Foo foo;
};
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2025-07-27 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 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```"]]