我想知道两个 RTTI 对象是否描述相同的类型。
假设描述相同类型的两个对象将引用同一个实例是否安全?
IF lo_typedescr1 = lo_typedescr2.
" Described types are identical
ELSE.
" Described types are not identical
ENDIF.
答案取决于您比较两种 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 对象:
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:
是的,类型描述对象是类型描述类的实例,并且对于每种类型,都有恰好一个类型描述对象。
参考文档运行时类型服务 (RTTS),概念部分。