自 2025 年 3 月 27 日起,我们建议您使用 android-latest-release
而非 aosp-main
构建 AOSP 并为其做出贡献。如需了解详情,请参阅 AOSP 的变更。
Safe Union
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
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;
};
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-03-26。
[null,null,["最后更新时间 (UTC):2025-03-26。"],[],[],null,["# Safe union\n\n`safe_union` in HIDL represents an explicitly tagged union type.\nThis is similar to a `union` except `safe_union` keeps\ntrack of the underlying type and is compatible with Java. The\n`safe_union` type is available in Android 10\nand higher for new and upgraded devices.\n\nSyntax\n------\n\nA `safe_union` is expressed in HIDL exactly like a\n`union` or `struct`. \n\n```scdoc\nsafe_union MySafeUnion {\n TypeA a;\n TypeB b;\n ...\n};\n```\n\nUsage\n-----\n\nAt runtime, a `safe_union` is only ever one type. By default, it's\nthe first type in the union. For instance, above,\n`MySafeUnion` is by default `TypeA`.\n\n`hidl-gen` generates a custom class or struct for a\n`safe_union` in both C++ and Java. This class includes a\ndiscriminator for each member (in `hidl_discriminator`), a method to\nget the current discriminator (`getDiscriminator`), and setters and\ngetters for each member. Each setter and getter is named exactly as its member.\nFor instance, the getter for `TypeA a` is called \"a\", and it\nreturns something of `TypeA`. The corresponding setter is also\nbe called \"a\" and takes a parameter of `TypeA`. Setting the value in\na `safe_union` updates the value of the discriminator as\nreturned by `getDiscriminator`. Accessing a value from a\ndiscriminator that isn't the current discriminator aborts the program. For\ninstance, if calling `getDiscriminator` on an instance of\n`MySafeUnion` returns `hidl_discriminator::b`, then\ntrying to retrieve `a` aborts the program.\n\nMonostate\n---------\n\nA `safe_union` always has a value, but if it is desired to not\nhave a value, use `android.hidl.safe_union@1.0::Monostate` as a\nplaceholder. For instance, the following union can either be\n`noinit` (empty) or `foo`: \n\n```python\nimport android.hidl.safe_union@1.0::Monostate;\n\nsafe_union OptionalFoo {\n Monostate noinit;\n Foo foo;\n};\n```"]]