HIDL 中的 safe_union
表示显式标记的联合类型。这与 union
类似,不同之处在于 safe_union
会跟踪底层类型,并且与 Java 兼容。safe_union
类型在 Android 10 及更高版本中适用于新的和升级的设备。
语法
在 HIDL 中,safe_union
的表达方式与 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; };