如何比较两个RTTI类型描述符是否相等?

问题描述 投票:0回答:2

我想知道两个 RTTI 对象是否描述相同的类型。

假设描述相同类型的两个对象将引用同一个实例是否安全?

IF lo_typedescr1 = lo_typedescr2.
  " Described types are identical
ELSE.
  " Described types are not identical
ENDIF.
oop abap rtti
2个回答
3
投票

答案取决于您比较两种 ABAP 类型的确切上下文,以及您用来认为类型相同的标准。

这里是一个示例,演示了“相同”类型有两个不同的 RTTI 对象(这意味着条件

IF type_1 = type_2
被评估为 false),一个使用
TYPE c LENGTH 1
声明,另一个使用
TYPE flag
声明,其中是类型 C 且长度为 1 的 ABAP 字典数据元素:

REPORT.
DATA type_1 TYPE REF TO cl_abap_typedescr.
DATA type_2 TYPE REF TO cl_abap_typedescr.
PERFORM get_type_1 CHANGING type_1.
PERFORM get_type_2 CHANGING type_2.
ASSERT 1 = 1. " <== debug place to look at RTTI Object References type_1 and type_2
FORM get_type_1 CHANGING type_1 TYPE REF TO cl_abap_typedescr.
  DATA one_character TYPE c LENGTH 1.
  type_1 = cl_abap_typedescr=>describe_by_data( one_character ).
ENDFORM.
FORM get_type_2 CHANGING type_2 TYPE REF TO cl_abap_typedescr.
  DATA one_character TYPE flag. " ABAP Dictionary CHAR 1
  type_2 = cl_abap_typedescr=>describe_by_data( one_character ).
ENDFORM.

通过调试我们看到RTTI对象是不同的:

这是另一个示例,也演示了“相同”结构类型有两个不同的 RTTI 对象:

  • get_type_1
    中:
    DATA: BEGIN OF structure,
            comp1 TYPE c LENGTH 1,
          END OF structure.
    type_1 = cl_abap_typedescr=>describe_by_data( structure ).
    
  • get_type_2
    中:
    DATA: BEGIN OF structure,
            comp1 TYPE c LENGTH 1,
          END OF structure.
    type_2 = cl_abap_typedescr=>describe_by_data( structure ).
    

在博客文章改善ABAP运行时类型创建(RTTC)的内存消耗中,我们可以看到使用方法

create
动态创建类型可能会创建多个与完全相同的类型对应的RTTI对象。

  • 这里不适用于方法
    create
    • get_type_1
      中:
      type_1 = cl_abap_structdescr=>create( VALUE #( ( name = 'COMP1' type = cl_abap_elemdescr=>get_c( 1 ) ) ) ).
      
    • get_type_2
      中:
      type_2 = cl_abap_structdescr=>create( VALUE #( ( name = 'COMP1' type = cl_abap_elemdescr=>get_c( 1 ) ) ) ).
      
  • 这里使用方法
    get
    效果很好:
    • get_type_1
      中:
      type_1 = cl_abap_structdescr=>get( VALUE #( ( name = 'COMP1' type = cl_abap_elemdescr=>get_c( 1 ) ) ) ).
      
    • get_type_2
      中:
      type_2 = cl_abap_structdescr=>get( VALUE #( ( name = 'COMP1' type = cl_abap_elemdescr=>get_c( 1 ) ) ) ).
      

官方的ABAP文档-运行时类型服务(RTTS)很无奈,因为它只用了几句话描述了RTTS。

当然,人们经常会发现测试

IF type_1 = type_2
会起作用,但正如我上面所解释的,情况并不总是如此。

为了完整起见,在下面的示例中,

IF type_1 = type_2
被评估为 true:

  • get_type_1
    中:
    DATA v1 TYPE c LENGTH 1.
    type_1 = cl_abap_typedescr=>describe_by_data( v1 ).
    
  • get_type_2
    中:
    DATA v2 TYPE c LENGTH 1.
    type_2 = cl_abap_typedescr=>describe_by_data( v2 ).
    
  • 调试:

3
投票

是的,类型描述对象是类型描述类的实例,并且对于每种类型,都有恰好一个类型描述对象。

参考文档运行时类型服务 (RTTS),概念部分。

© www.soinside.com 2019 - 2024. All rights reserved.