safe_union
dans HIDL représente un type d'union explicitement tagué.
Cette méthode est semblable à union
, sauf que safe_union
conserve
du type sous-jacent et est
compatible avec Java. La
Le type safe_union
est disponible dans Android 10
et plus élevés pour les appareils neufs et plus récents.
Syntaxe
Un safe_union
est exprimé en HIDL exactement comme un
union
ou struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Utilisation
Lors de l'exécution, un safe_union
n'est qu'un seul type. Par défaut, il s'agit
le premier type de l'union. Par exemple, ci-dessus,
La valeur par défaut de MySafeUnion
est TypeA
.
hidl-gen
génère une classe ou un struct personnalisé pour un
safe_union
en C++ et Java. Ce cours comprend une
discriminateur pour chaque membre (dans hidl_discriminator
), une méthode pour
obtenir le discriminateur actuel (getDiscriminator
), les setters et
des getters pour chaque membre. Chaque setter et getter porte le nom exact de son membre.
Par exemple, le getter de TypeA a
s'appelle "a".
renvoie TypeA
. Le setter correspondant est également
être désigné par "un" et accepte un paramètre de TypeA
. Définir la valeur dans
Un safe_union
met à jour la valeur du discriminateur comme suit :
renvoyé par getDiscriminator
. Si vous accédez à une valeur à partir d'un
un discriminateur qui n'est pas
le discriminateur actuel abandonne le programme. Pour
instance, si vous appelez getDiscriminator
sur une instance de
MySafeUnion
renvoie hidl_discriminator::b
, puis
la tentative de récupération de a
annule le programme.
Monostate
Un safe_union
a toujours une valeur, mais si vous ne souhaitez pas
une valeur, utilisez android.hidl.safe_union@1.0::Monostate
comme valeur
. 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; };