safe_union
in HIDL rappresenta un tipo di unione con tag esplicitamente.
È simile a union
, ad eccezione di safe_union
che conserva
del tipo sottostante ed è compatibile con Java. La
Il tipo di safe_union
è disponibile su Android 10
e superiori per i dispositivi nuovi e di cui è stato eseguito l'upgrade.
Sintassi
Un safe_union
viene espresso in modalità HIDL esattamente come una
union
o struct
.
safe_union MySafeUnion { TypeA a; TypeB b; ... };
Utilizzo
In fase di runtime, safe_union
è sempre un solo tipo. Per impostazione predefinita,
il primo tipo nell'unione. Ad esempio, sopra,
Il valore predefinito di MySafeUnion
è TypeA
.
hidl-gen
genera una classe o uno struct personalizzato per un
safe_union
sia in C++ che in Java. Questo corso include un
discriminatore per ogni membro (in hidl_discriminator
), un metodo per
ottenere l'attuale discriminatore (getDiscriminator
),
getter per ogni membro. A ogni setter e getter è indicato il nome del rispettivo membro.
Ad esempio, il getter per TypeA a
si chiama "a" e
restituisce un valore TypeA
. Anche il setter corrispondente
chiamati "a" e richiede un parametro di TypeA
. Impostando il valore in
safe_union
aggiorna il valore del discriminatore
restituito da getDiscriminator
. Accesso a un valore da un
il discriminatore corrente che non è quello attuale interrompe il programma. Per
se chiami getDiscriminator
su un'istanza di
MySafeUnion
restituisce hidl_discriminator::b
, poi
il tentativo di recuperare a
interrompe il programma.
Monostato
Un safe_union
ha sempre un valore, ma se si desidera non
hanno un valore, usa 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; };