Ansicht
Dokumentation

ABAPMOVE_CAST - MOVE CAST

ABAPMOVE_CAST - MOVE CAST

ROGBILLS - Synchronize billing plans   Vendor Master (General Section)  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

=, ?=, Upcast und Downcast

destination_ref =$|?= source_ref.

Wirkung

Zuweisung zwischen zwei Referenzvariablen. Die in source_ref enthaltene Referenz wird destination_ref zugewiesen. Nach erfolgreicher Zuweisung zeigt destination_ref auf das gleiche Objekt wie source_ref (Referenzsemantik). Die Zuweisung von Referenzvariablen ist eine spezielle Form der Zuweisung von Datenobjekten, wobei für die Zuweisung zwischen Referenzvariablen zwei Zuweisungsoperatoren zur Verfügung stehen, deren Verwendung sich nach den Zuweisungsregeln für Referenzvariablen richtet:

  • Der allgemeine Zuweisungsoperator = kann bei einer Zuweisung zwischen Referenzvariablen nur für Upcasts verwendet werden, bei dem der statische Typ von source_ref spezieller oder gleich dem statischen Typ von destination_ref ist.
  • Der spezielle Casting-Operator ?= kann nur für Zuweisungen zwischen Referenzvariablen verwendet werden. Wenn der statische Typ von source_ref allgemeiner als der statische Typ von destination_ref ist, muss ?= verwendet werden, um einen Downcast zu bewirken. Dies wird falls statisch erkennbar von der Syntaxprüfung und ansonsten zur Laufzeit überprüft. Der eigentliche Downcast, d.h. die Überprüfung, ob eine Zuweisung nach den Zuweisungsregeln für Referenzvariablen möglich ist, findet immer erst zur Laufzeit statt. Wenn der statische Typ von destination_ref dann nicht allgemeiner oder gleich dem dynamischen Typ von source_ref ist, kommt es zu einer behandelbaren Ausnahme und die Zielvariable behält ihren ursprünglichen Wert.

Für die rechte und linke Seite gilt das Gleiche wie bei der Zuweisung von Datenobjekten, mit folgenden Einschränkungen:

  • Eine Inline-Deklaration DATA(var) oder FINAL(var) ist nur auf der linken Seite von =, aber nicht von ?= möglich. Es wird der statische Typ der Referenzvariable source_ref verwendet, der statisch erkennbar sein muss.

Hinweise

  • Der Casting-Operator ?= kann immer, also auch für Upcasts, angegeben werden. Dies ist in aller Regel aber nicht notwendig.
  • Wenn statisch erkennbar ist, dass eine Zuweisung prinzipiell nicht möglich ist, kann weder = noch ?= verwendet werden. Dies ist beispielsweise der Fall, wenn die statischen Typen von Quell- und Zielvariable Klassen aus unterschiedlichen Pfaden des Vererbungsbaums sind.
  • Die Null-Referenz einer initialen Referenzvariable kann bei einem Downcast jeder Zielvariable zugewiesen werden, die dort angegeben werden kann. Das Gleiche gilt für eine nicht-initiale ungültige Referenz, die auf kein Objekt mehr zeigt.
  • Für nicht initiale Referenzvariablen kann mit dem Prädikatausdruck IS INSTANCE OF oder der Fallunterscheidung CASE TYPE OF überprüft werden, ob ein Downcast auf bestimmte Klassen oder Interfaces möglich ist.
  • Neben ?= gibt es einen weiteren Casting-Operator CAST, der Downcasts an Operandenpositionen ermöglicht und damit hilft, Hilfsvariablen einzusparen.
  • Downcasts sind auch über den INTO-Zusatz der Anweisung WHEN TYPE einer Fallunterscheidung mit CASE TYPE OF möglich.
  • Eine obsolete Form des Downcasts ist die Anweisung MOVE mit dem Zusatz ?TO.

Beispiel

Die ersten beiden Zuweisungen des folgenden Quelltextabschnitts sind Upcasts:

  • Der Instanzierungsoperator NEW erzeugt ein Resultat vom statischen und dynamischen Typ c2, welcher der allgemeineren Referenzvariable oref1 zugewiesen werden kann.
  • An die Referenzvariable oref vom allgemeinsten statischen Typ object kann jede Referenzvariable zugewiesen werden.

Die nächsten beiden Zuweisungen sind Downcasts:

  • Es kann erst zur Laufzeit überprüft werden, ob die allgemeine Referenzvariable oref auf ein Objekt zeigt, auf das auch oref2 zeigen darf. Dies ist im Beispiel der Fall.
  • Der Downcast von oref2 nach oref3 schlägt dagegen zur Laufzeit fehl und erzeugt die abgefangene Ausnahme.

Ausnahmen

Behandelbare Ausnahmen

CX_SY_MOVE_CAST_ERROR

  • Ursache: Typkonflikt im Downcast
    Laufzeitfehler: MOVE_CAST_ERROR
  • Ursache: Quell- oder Zielvariable sind keine Referenzvariable
    Laufzeitfehler: MOVE_CAST_REF_ONLY
  • Ursache: Dynamischer Typkonflikt bei Zuweisung von Referenzen
    Laufzeitfehler: MOVE_CAST_ERROR_DYN





PERFORM Short Reference   PERFORM Short Reference  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 8376 Date: 20240523 Time: 142948     sap01-206 ( 123 ms )