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
。
在 C++ 和 Java 中,hidl-gen
会为 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; };