safe_union
中的 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; };