safe_union
en HIDL representa un tipo de unión etiquetado explícitamente. Esto es similar a una 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
Una safe_union
se expresa en HIDL exactamente como una union
o struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Uso
En tiempo de ejecución, una safe_union
es solo de un tipo. Por defecto, será el primer tipo de la unión. Por ejemplo, arriba, MySafeUnion
es TypeA
por defecto.
hidl-gen
genera una clase o estructura personalizada para safe_union
tanto en C++ como en Java. Esta clase incluye un discriminador para cada miembro (en hidl_discriminator
), un método para obtener el discriminador actual ( getDiscriminator
) y definidores y captadores para cada miembro. Cada definidor y captador recibe el mismo nombre que su miembro. Por ejemplo, el captador de TypeA a
se llamará "a" y devolverá algo de TypeA
. El definidor correspondiente también se llamará "a" y tomará un parámetro de TypeA
. Establecer el valor en safe_union
actualizará el valor del discriminador tal como lo devuelve getDiscriminator
. Acceder a un valor de un discriminador que no es el discriminador actual aborta el programa. Por ejemplo, si llamar getDiscriminator
en una instancia de MySafeUnion
devuelve hidl_discriminator::b
, intentar recuperar a
abortará el programa.
monoestado
safe_union
siempre tiene un valor, pero si desea que no tenga valor, use 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; };