HIDL 中的 safe_union
代表明確標記的聯集型別。這與 union
類似,但 safe_union
會追蹤基礎型別,且與 Java 相容。搭載 Android 10 以上版本的新裝置和升級裝置,都支援 safe_union
類型。
語法
safe_union
在 HIDL 中的表示方式與 union
或 struct
完全相同。
safe_union MySafeUnion { TypeA a; TypeB b; ... };
用量
在執行階段,safe_union
一律只會是一種型別。根據預設,這是聯集中的第一個型別。舉例來說,上方的 MySafeUnion
預設為 TypeA
。
hidl-gen
會在 C++ 和 Java 中為 hidl-gen
產生自訂類別或結構體。safe_union
這個類別包含每個成員的鑑別器 (在 hidl_discriminator
中)、取得目前鑑別器的方法 (getDiscriminator
),以及每個成員的設定器和取得器。每個設定器和擷取器都會以其成員命名。舉例來說,TypeA a
的 getter 稱為「a」,且會傳回 TypeA
的某個項目。對應的 setter 也會稱為「a」,並採用 TypeA
參數。在 safe_union
中設定值會更新鑑別器傳回的值。getDiscriminator
如果從不是目前鑑別器的鑑別器存取值,程式就會中止。舉例來說,如果在 MySafeUnion
的 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; };