2025 年 3 月 27 日より、AOSP のビルドとコントリビューションには aosp-main
ではなく android-latest-release
を使用することをおすすめします。詳細については、AOSP の変更をご覧ください。
Safe Union
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
HIDL の safe_union
は、明示的にタグ付けされた共用体型を表します。union
と似ていますが、safe_union
は基になる型をトラッキングし、Java と互換性がある点で異なります。safe_union
型は、Android 10 以上の新しいデバイスおよびアップグレードされたデバイスで使用できます。
構文
safe_union
は、union
や struct
とまったく同じように HIDL で表現されます。
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};
用途
実行時、safe_union
は常に 1 つの型のみになります。デフォルトでは、共用体の最初の型です。上記の例では、MySafeUnion
はデフォルトでは TypeA
です。
hidl-gen
は、safe_union
のカスタムクラスまたは構造体を C++と Java の両方で生成します。このクラスには、各メンバーの弁別子(hidl_discriminator
内)、現在の弁別子を取得するメソッド(getDiscriminator
)、各メンバーのセッターとゲッターが含まれます。各セッターとゲッターには、そのメンバーとまったく同じ名前が付けられます。たとえば、TypeA a
のゲッターは「a」と呼ばれ、TypeA
の何かを返します。対応するセッターも「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 および関連会社の商標または登録商標です。
最終更新日 2025-03-26 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2025-03-26 UTC。"],[],[],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```"]]