HIDL 中的 safe_union
代表明確標記的聯集類型。這與 union
類似,但 safe_union
會追蹤基礎類型,且與 Java 相容。safe_union
類型適用於 Android 10 以上版本,適用於新的裝置和升級裝置。
語法
safe_union
是以 HIDL 的形式在 HIDL 中表示,與 union
或 struct
完全相同。
safe_union MySafeUnion { TypeA a; TypeB b; ... };
用量
safe_union
在執行階段只會是一種類型。根據預設,這是聯集中的第一個類型。舉例來說,在上述範例中,MySafeUnion
預設為 TypeA
。
hidl-gen
會針對 C++ 和 Java 中的 safe_union
產生自訂類別或結構。這個類別包含每個成員 (在 hidl_discriminator
中) 的辨別器、用於取得目前辨別器 (getDiscriminator
) 的方法,以及每個成員的 setter 和 getter。每個 setter 和 getter 的名稱都與其成員完全相同。舉例來說,TypeA a
的 getter 稱為「a」,會傳回 TypeA
的內容。對應的 setter 也稱為「a」,並採用 TypeA
參數。在 safe_union
中設定值,即可將鑑別器值更新為 getDiscriminator
傳回的值。如果從非目前的判別子存取值,程式就會中止。舉例來說,如果在 MySafeUnion
執行個體上呼叫 getDiscriminator
會傳回 hidl_discriminator::b
,則嘗試擷取 a
就會取消程式。
Monostate
safe_union
一律有值,但如果不想設定值,請使用 android.hidl.safe_union@1.0::Monostate
做為預留位置。舉例來說,下列聯集可以是 noinit
(空白) 或 foo
:
import android.hidl.safe_union@1.0::Monostate; safe_union OptionalFoo { Monostate noinit; Foo foo; };