HIDL 中的safe_union
表示明確標記的聯合類型。這與union
類似,只不過safe_union
追蹤底層類型並且與 Java 相容。 safe_union
類型在 Android 10 及更高版本中適用於新裝置和升級裝置。
句法
safe_union
在 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
將中止程式。
單態
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; };