Assignment between two reference variables. The reference in source_ref is
assigned destination_ref. After a successful assignment, destination_ref points to the same object as source_ref
(reference semantics). The assignment of reference variables is a special form of
assignments of data objects, whereby two assignment operators are available for assignments between reference variables and are used in accordance with the
assignment rules for reference variables:
In assignments between reference variables, the general assignment operator = can only be used for
up casts in which the static
type of source_ref is more specific than or the same as the static type of destination_ref.
The special casting
operator?= can only be used for assignments between reference variables.
If the static type of source_ref is more general than the static type of destination_ref, ?= must be used to produce a
down cast. If this is known
statically, it is checked by the syntax check, otherwise it is checked at runtime. The actual down cast, that is, the check to see whether assignments are possible in accordance with the
assignment rules for reference variables, only
takes place at runtime. Then, if the static type of destination_ref is not
more general or is the same as the dynamic type of source_ref, a catchable exception is raised and the target variable keeps its original value.
The same applies to the right side and left side as when assigning data objects, with the following restrictions:
An inline declaration DATA(var)
is possible only on the left side of =, and not on the left side of
?=. The static types of the reference variable source_ref is used, which must be known statically.
The casting operator ?= can always be specified, even for up casts. This is, however, not usually necessary.
If it is possible to know statically that an assignment is not possible, neither =
nor ?= can be used. This is the case, for example, when the static types of source variables and target variables are classes from different paths of the inheritance tree.
The null reference
of an initial reference variable can be assigned to every target variable in a down cast that can be specified here. The same applies to a non-initial invalid reference that no longer points to an object.
For non-initial reference variables, the predicate expression IS INSTANCE OF or the case distinction
CASE TYPE OF can be used to check whether a down cast is possible on specific classes or interfaces.
In addition to ?=, the
casting operatorCAST also enables down casts in operand positions, which helps to reduce helper variables.
Down casts are also possible using the INTO addition of the statement
WHEN TYPE of a case distinction using CASE TYPE OF.