Ab dem 27. März 2025 empfehlen wir, android-latest-release
anstelle von aosp-main
zu verwenden, um AOSP zu erstellen und Beiträge dazu zu leisten. Weitere Informationen finden Sie unter Änderungen am AOSP.
Sichere Verbindung
Mit Sammlungen den Überblick behalten
Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.
safe_union
in HIDL steht für einen explizit getaggten Union-Typ.
Das ist ähnlich wie bei union
, mit dem Unterschied, dass safe_union
den zugrunde liegenden Typ im Blick behält und mit Java kompatibel ist. Der Typ safe_union
ist unter Android 10 und höher für neue und aktualisierte Geräte verfügbar.
Syntax
Ein safe_union
wird in HIDL genau wie ein union
oder struct
ausgedrückt.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};
Nutzung
Bei der Laufzeit hat ein safe_union
immer nur einen Typ. Standardmäßig ist dies der erste Typ in der Union. Im obigen Beispiel ist MySafeUnion
standardmäßig TypeA
.
hidl-gen
generiert eine benutzerdefinierte Klasse oder Struktur für eine safe_union
sowohl in C++ als auch in Java. Diese Klasse enthält einen Diskriminator für jedes Mitglied (in hidl_discriminator
), eine Methode zum Abrufen des aktuellen Diskriminators (getDiscriminator
) sowie Setter und Getter für jedes Mitglied. Jeder Setter und Getter hat genau denselben Namen wie sein Mitglied.
Angenommen, der Getter für TypeA a
heißt „a“ und gibt etwas von TypeA
zurück. Der entsprechende Setter wird ebenfalls „a“ genannt und nimmt einen Parameter vom Typ TypeA
an. Wenn du den Wert in einer safe_union
festlegst, wird der Wert des Discriminators aktualisiert, der von getDiscriminator
zurückgegeben wird. Wenn Sie auf einen Wert aus einem Diskriminator zugreifen, der nicht der aktuelle Diskriminator ist, wird das Programm abgebrochen. Wenn beispielsweise der Aufruf von getDiscriminator
für eine Instanz von MySafeUnion
den Wert hidl_discriminator::b
zurückgibt, wird das Programm beim Versuch, a
abzurufen, abgebrochen.
Monostate
safe_union
hat immer einen Wert. Wenn kein Wert gewünscht ist, verwenden Sie android.hidl.safe_union@1.0::Monostate
als Platzhalter. Die folgende Union kann beispielsweise noinit
(leer) oder foo
sein:
import android.hidl.safe_union@1.0::Monostate;
safe_union OptionalFoo {
Monostate noinit;
Foo foo;
};
Alle Inhalte und Codebeispiele auf dieser Seite unterliegen den Lizenzen wie im Abschnitt Inhaltslizenz beschrieben. Java und OpenJDK sind Marken oder eingetragene Marken von Oracle und/oder seinen Tochtergesellschaften.
Zuletzt aktualisiert: 2025-07-27 (UTC).
[[["Leicht verständlich","easyToUnderstand","thumb-up"],["Mein Problem wurde gelöst","solvedMyProblem","thumb-up"],["Sonstiges","otherUp","thumb-up"]],[["Benötigte Informationen nicht gefunden","missingTheInformationINeed","thumb-down"],["Zu umständlich/zu viele Schritte","tooComplicatedTooManySteps","thumb-down"],["Nicht mehr aktuell","outOfDate","thumb-down"],["Problem mit der Übersetzung","translationIssue","thumb-down"],["Problem mit Beispielen/Code","samplesCodeIssue","thumb-down"],["Sonstiges","otherDown","thumb-down"]],["Zuletzt aktualisiert: 2025-07-27 (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```"]]