ABAP Keyword Documentation → ABAP − Reference → Processing Internal Data → Assignments → Assigning References → Setting Reference Variables
=, ?= - Up Cast and Down Cast
Other versions:
7.31 | 7.40 | 7.54
Syntax
destination_ref =|?= source_ref.
Effect
Assignment between two reference variables. The reference in source_ref
is
assigned destination_ref
. If the assignment is successful, 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; two assignment operators are available for assignments between reference variables and these operators are used in accordance with the
assignment rules for reference variables:
-
in assignments between reference variables, the assignment operator
=
can only be used for up casts in which the static type ofsource_ref
is more specific than or the same as the static type ofdestination_ref
. -
The special casting operator
?=
can only be used for assignments between reference variables. If the static type ofsource_ref
is more general than the static type ofdestination_ref
,?=
must be used to produce a down cast. If this is known statically, it is checked by the syntax check; if not, 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) never takes place until runtime. If, then, the static type ofdestination_ref
is not more general or is the same as the dynamic type ofsource_ref
, a handleable 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:
- The data types of the source and target are reference types, which means that functional method calls and constructor expressions and table expressions can be specified on the right side whose return value has a reference type. Built-in functions and calculation expressions do not return any reference variables and are not possible here.
-
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 variablesource_ref
is used, which must be known statically.
Notes
-
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 assignments are not possible, neither
=
nor?=
can be used. This is the case, for example, when the static types of source variables and target variables come 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 can be applied to specific classes or interfaces.
-
Alongside
?=
, the casting operatorCAST
also enables down casts to operand positions, which saves on helper variables. -
Down casts are also possible using the
INTO
addition of the statementWHEN TYPE
of a case distinction usingCASE TYPE OF
. -
The casting operator
?=
cannot be used in multiple assignments. -
One obsolete form of down cast is the statement
MOVE with the addition
?TO
.
Example
The first two assignments in the following source code section are up casts:
-
The instance operator
NEW
creates a result with the static and dynamic typec2
, which can be assigned to the more general reference variableoref1
. -
Any reference variable can be assigned to the reference variable
oref
with the most general static typeobject
.
The next two assignments are down casts:
-
It is not possible to test whether the general reference variable
oref
points to an object that can also point tooref2
until runtime. This is the case in the example. -
The down cast of
oref2
tooref3
, however, fails at runtime and raises the caught exception.
CLASS c1 DEFINITION INHERITING FROM object.
ENDCLASS.
CLASS c2 DEFINITION INHERITING FROM c1.
ENDCLASS.
CLASS c3 DEFINITION INHERITING FROM c2.
ENDCLASS.
DATA oref TYPE REF TO object.
DATA oref1 TYPE REF TO c1.
DATA oref2 TYPE REF TO c2.
DATA oref3 TYPE REF TO c3.
oref1 = NEW c2( ).
oref = oref1.
IF oref IS INSTANCE OF c2.
oref2 ?= oref.
ENDIF.
TRY.
oref3 ?= oref2.
CATCH cx_sy_move_cast_error.
...
ENDTRY.
Exceptions
Handleable Exceptions
CX_SY_MOVE_CAST_ERROR
-
Cause: Type conflict in down cast
Runtime error:MOVE_CAST_ERROR
-
Cause: Source variable or target variable is not a reference variable
Runtime error:MOVE_CAST_REF_ONLY
-
Cause: Dynamic type conflict in assignment of references
Runtime error:MOVE_CAST_ERROR_DYN