Od 27 marca 2025 r. zalecamy używanie android-latest-release
zamiast aosp-main
do kompilowania i wspołtworzenia AOSP. Więcej informacji znajdziesz w artykule o zmianach w AOSP.
Bezpieczne zjednoczenie
Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
safe_union
w HIDL reprezentuje jednoznacznie oznaczony typ zjednoczenia.
Jest to podobne do union
, z tym że safe_union
śledzi typ bazowy i jest zgodny z językiem Java. Typ safe_union
jest dostępny w Androidzie 10 i nowszych wersjach na nowych i uaktualnionych urządzeniach.
Składnia
W HIDL element safe_union
jest wyrażany dokładnie tak samo jak element union
lub struct
.
safe_union MySafeUnion {
TypeA a;
TypeB b;
...
};
Wykorzystanie
W czasie wykonywania safe_union
ma zawsze tylko jeden typ. Domyślnie jest to pierwszy typ w zbiorze. Na przykład w przykładzie powyżej zmienna MySafeUnion
ma domyślnie wartość TypeA
.
hidl-gen
generuje niestandardową klasę lub strukturę dla funkcji safe_union
w C++ i Java. Ta klasa zawiera wyróżnik dla każdego elementu (w hidl_discriminator
), metodę do pobierania bieżącego wyróżnika (getDiscriminator
) oraz metody ustawiania i pobierania dla każdego elementu. Każda metoda setter i getter ma taką samą nazwę jak jej element.
Na przykład metoda dostępu do właściwości TypeA a
nosi nazwę „a” i zwraca coś z TypeA
. Odpowiadający mu setter ma też nawę „a” i parametry TypeA
. Ustawienie wartości w a safe_union
aktualizuje wartość dyskryminatora zwracanego przez getDiscriminator
. Uzyskanie dostępu do wartości z kryterium, które nie jest bieżącym kryterium, powoduje przerwanie programu. Jeśli na przykład wywołanie getDiscriminator
w instancji MySafeUnion
zwraca wartość hidl_discriminator::b
, próba pobrania wartości a
powoduje przerwanie programu.
Monostate
Element safe_union
ma zawsze wartość, ale jeśli nie chcesz podawać wartości, użyj zmiennej android.hidl.safe_union@1.0::Monostate
jako elementu zastępczego. Na przykład ta operacja union może być noinit
(pusta) lub foo
:
import android.hidl.safe_union@1.0::Monostate;
safe_union OptionalFoo {
Monostate noinit;
Foo foo;
};
Treść strony i umieszczone na niej fragmenty kodu podlegają licencjom opisanym w Licencji na treści. Java i OpenJDK są znakami towarowymi lub zastrzeżonymi znakami towarowymi należącymi do firmy Oracle lub jej podmiotów stowarzyszonych.
Ostatnia aktualizacja: 2025-07-27 UTC.
[[["Łatwo zrozumieć","easyToUnderstand","thumb-up"],["Rozwiązało to mój problem","solvedMyProblem","thumb-up"],["Inne","otherUp","thumb-up"]],[["Brak potrzebnych mi informacji","missingTheInformationINeed","thumb-down"],["Zbyt skomplikowane / zbyt wiele czynności do wykonania","tooComplicatedTooManySteps","thumb-down"],["Nieaktualne treści","outOfDate","thumb-down"],["Problem z tłumaczeniem","translationIssue","thumb-down"],["Problem z przykładami/kodem","samplesCodeIssue","thumb-down"],["Inne","otherDown","thumb-down"]],["Ostatnia aktualizacja: 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```"]]