ABAP :新语法 - REF

📅 2026/7/1 18:15:11 ✍️ 编辑团队 👁️ 阅读次数
ABAP :新语法 - REF
REF是ABAP中构造函数表达式的组成部分属于内置的构造函数运算符。它的核心作用是在操作数位置构造一个指向数据对象的引用或控制表表达式table expression的结果。与其他构造函数运算符如NEW、CAST、VALUE等不同REF的结果始终是一个数据引用变量data reference variable。语法REF type ( dobj ) | ( table_exp )REF type( dobj )—— 取数据对象的引用当参数是一个数据对象dobjdata object时,创建一个指向该数据对象的引用变量。关于type静态类型的确定可以指定非泛型数据类型dtype需遵循引用变量的向上转型规则。可以指定泛型类型data。可以指定#由编译器按以下优先级自动推导如果操作数位置所需的数据类型是唯一且完全已知的使用该类型如果无法从上下文推导使用dobj本身的类型如果dobj的类型在静态上未知则使用泛型data。案例获取内表引用并赋值TYPES pict_line(1022) type x. DATA pict TYPE STANDARD TABLE OF pict_line WITH EMPTY KEY. DATA ext_data TYPE cl_abap_browserload_tab. ext_data VALUE #( ( name PICT_GIF type image dref REF #( pict ) ) ).解析REF #( pict )创建了一个指向内表pict的数据引用并将其赋值给ext_data的dref组件。这里没有复制pict的数据只传递了引用地址避免了大数据量的拷贝。案例获取结构体地址并赋值TYPES: BEGIN OF lty_data, matnr TYPE mara-matnr, mtart TYPE mara-mtart, matkl TYPE mara-matkl, text1 TYPE char50, END OF lty_data. DATA(lwa_data) VALUE lty_data( matnr MATERIAL-001 mtart FOOD matkl 1010 text1 FIRST ). DATA(lv_ref) REF #( lwa_data ). lv_ref-* VALUE #( matnr MATERIAL-002 mtart FOOD matkl 1010 ). cl_demo_outputdisplay( lwa_data ). lv_ref-text1 SECOND. cl_demo_outputdisplay( lwa_data ).测试结果REF type( table_exp )—— 控制表表达式的结果当参数是一个表表达式table expression时REF的作用是控制表表达式的结果类型——使其返回一个指向查找到的内表行的临时数据引用变量而不是工作区或字段符号。案例获取内表特定行的引用DATA itab TYPE STANDARD TABLE OF i WITH EMPTY KEY. itab VALUE #( FOR i 1 UNTIL i GE 10 ( i * 10 ) ). DATA(dref1) REF #( itab[ 5 ] ). 如果找不到第15行返回指向 999 的引用不会抛出异常 DATA(dref2) REF #( itab[ 15 ] DEFAULT REF #( 999 ) ). cl_demo_outputdisplay( dref1-* ). cl_demo_outputdisplay( dref2-* ).实战案例1在方法调用中直接传递引用。CLASS lcl_demo DEFINITION. PUBLIC SECTION. METHODS test_ref IMPORTING ir_data TYPE REF TO data. ENDCLASS. CLASS lcl_demo IMPLEMENTATION. METHOD test_ref. ASSIGN ir_data-* TO FIELD-SYMBOL(fs_data). WRITE:/,fs_data. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA lv_string TYPE string VALUE 测试测试. SELECT SINGLE * INTO DATA(lw_makt) FROM makt. NEW lcl_demo( )-test_ref( REF #( lv_string ) ). NEW lcl_demo( )-test_ref( REF #( lw_makt ) ).解析#是类型占位符编译器会根据上下文自动推导数据类型。如果上下文无法推导则使用dobj本身的类型。实战案例向上转型Upcast安全、自动化的“泛化”。向上转型是指将类型更具体的引用赋值给类型更通用或相同的引用变量方向具体类型 → 通用类型。这好比说“这只狗具体是一只动物通用”逻辑上是完全安全的。向上转型的场景将完全类型化的数据引用赋值给泛型类型REF TO data的变量在面向对象中将子类引用赋值给父类应用。简单demoDATA lv_num TYPE i VALUE 99. DATA(lv_specific) REF #( lv_num ). DATA lv_generic TYPE REF TO data. 向上转型将具体的I类型变量 赋值给 通用的DATA类型引用 lv_generic lv_specific. ASSIGN lv_generic-* to FIELD-SYMBOL(fs_data). WRITE:fs_data.实战案例向下转型 (Downcast)危险、需显式的“特化”向下转型是指将类型更通用的引用赋值给类型更具体或相同的引用变量。方向通用类型 → 具体类型。这好比说“这只动物通用是一只狗具体”逻辑上不一定成立它可能是一只猫因此是危险的。向下转型的场景将泛型REF TO data的引用向下转型回具体的类型。运行时检查和异常向下转型的语法检查是允许的因为有但真正的类型检查发生在程序运行时。转型不成功SAP将会抛出一个可捕获的异常并且目标变量保持其原有值不变。 安全的向下转型 IF lv_generic IS INSTANCE OF TYPE i. 检查通过可以安全转型 DATA(lv_specific) CAST #( lv_generic ). ELSE. 处理类型不匹配的情况 ENDIF.