ABAP - Schlüsselwortdokumentation →  ABAP - Referenz →  Interne Daten verarbeiten →  Zuweisungen →  Referenzen zuweisen →  Referenzvariablen setzen → 

CAST - Casting-Operator

Syntax

... CAST type( [let_exp] dobj ) ...

Wirkung

Ein Konstruktorausdruck mit dem Casting-Operator CAST führt einen Down Cast oder einen Up Cast für das Argument dobj aus und erzeugt als Resultat eine Referenzvariable, vom statischen Typ type. Für type können angegeben werden:

In den Klammern muss genau ein unbenanntes Argument dobj angegeben werden. Wenn ein Datentyp angegeben ist, muss dobj eine Datenreferenzvariable sein. Bei einem Objekttyp muss dobj eine Objektreferenzvariable sein. Bei dobj handelt es sich um eine allgemeine Ausdrucksposition.

Das Casting von dobj in den angegebenen Typ erfolgt nach den gleichen Regeln wie beim Casting-Operator für Zuweisungen ?=. Wenn der angegebene Typ type spezieller als der statische Typ von dobj ist, handelt es sich um einen Down Cast. Wenn type allgemeiner als der statische Typ von dobj ist, handelt es sich um einen expliziten Up Cast.

Ein einzelner Ausdruck ohne nachfolgenden Objektkomponenten-Selektor -> kann als eigene Anweisung aufgeführt werden. Damit kann beispielsweise durch Abfangen der zugehörigen Ausnahme CX_SY_MOVE_CAST_ERROR die Durchführbarkeit eines Down Casts getestet werden.

Wenn ein einzelner Ausdruck über genau einen nachfolgenden Objektkomponenten-Selektor -> auf ein Datenobjekt oder eine Komponente eines Datenobjekts zeigt,

Optional kann vor dem Argument ein LET-Ausdruck let_exp zur Definition lokaler Hilfsfelder aufgeführt werden.

Hinweise

Beispiel

Der folgende Quelltextabschnitt zeigt zwei gleichwertige Down Casts mit den beiden möglichen Casting-Operatoren ?= und CAST. Vor dem eigentlichen Cast wird die Machbarkeit mit dem Prädikatausdruck IS INSTANCE OF überprüft.

CLASS c1 DEFINITION.
ENDCLASS.
CLASS c2 DEFINITION INHERITING FROM c1.
ENDCLASS.

DATA: oref1 TYPE REF TO c1,
      oref2 TYPE REF TO c2.

oref1 = new c2( ).

IF oref1 IS INSTANCE OF c2.
  oref2 ?= oref1.
  oref2 =  CAST #( oref1 ).
ENDIF.

Beispiel

Verwendung von Dereferenzierungsoperator und Komponentenselektor bei CAST mit Datentypen. Die Konstruktorausdrücke sind als schreibbare Ausdrücke auf der rechten und linken Seite von Zuweisungen mit dem Zuweisungsoperator = möglich.

TYPES: BEGIN OF t_struc,
        col1 TYPE i,
        col2 TYPE i,
       END OF t_struc.

DATA dref  TYPE REF TO data.
DATA struc TYPE t_struc.

dref = NEW t_struc( ).

struc      = CAST t_struc( dref )->*.
struc-col1 = CAST t_struc( dref )->col1.
struc-col2 = CAST t_struc( dref )->col2.

CAST t_struc( dref )->*    = struc.
CAST t_struc( dref )->col1 = struc-col1.
CAST t_struc( dref )->col2 = struc-col2.

Beispiel

In den RTTS wird oft eine Hilfsvariable benötigt, um einen Down Cast eines Typbeschreibungsobjekts auf eine spezialisierte Klasse durchzuführen. Die Beispiele zeigen, wie diese durch die Verwendung des Operators CAST eingespart werden kann.

DATA(attributes) =
  CAST cl_abap_classdescr(
       cl_abap_classdescr=>describe_by_name( 'CL_ABAP_FORMAT' )
       )->attributes.

DATA(components) =
  CAST cl_abap_structdescr(
       cl_abap_typedescr=>describe_by_name( 'T100' )
       )->components.

DATA(no_of_components) =
  lines( CAST cl_abap_structdescr(
              cl_abap_typedescr=>describe_by_name( 'SYST' )
              )->get_components( ) ).

Beispiel

Die Factory-Methode der folgenden Klasse gibt eine Referenzvariable vom Typ der Klasse selbst zurück. Um wie empfohlen über Interfacereferenzvariablen auf die im Interface if deklarierten Komponenten zuzugreifen, wird die inline deklarierte Variable iref auf den Typ des Interface gecasted.

INTERFACE if.
  ...
ENDINTERFACE.

CLASS cl DEFINITION CREATE PRIVATE.
  PUBLIC SECTION.
    INTERFACES if.
    CLASS-METHODS factory RETURNING value(ref) TYPE REF TO cl.
    ...
ENDCLASS.

CLASS cl IMPLEMENTATION.
  METHOD factory.
    ref = NEW #( ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  DATA(iref) = CAST if( cl=>factory( ) ).