Dart 在什么情况下reflectClass(o.runtimeType)返回与reflect(o.type)不同的结果?

Dart 在什么情况下reflectClass(o.runtimeType)返回与reflect(o.type)不同的结果?,dart,dart-mirrors,Dart,Dart Mirrors,从用于实例的镜像类型中: “在反射对象的实际类上返回镜像。反射对象的类可能不同于通过调用反射对象上的runtimeType返回的对象。” 那么在什么情况下,reflectClass(o.runtimeType)返回与reflect(o.type)不同的结果呢 我已尝试使用示例代码: 导入“dart:mirrors”; A类{} void main(){ var string=“str”; var布尔值=真; var整数=5; var-map={}; var列表=[]; var custom=ne

从用于
实例的镜像类型中

“在反射对象的实际类上返回镜像。反射对象的类可能不同于通过调用反射对象上的runtimeType返回的对象。”

那么在什么情况下,
reflectClass(o.runtimeType)
返回与
reflect(o.type)
不同的结果呢

我已尝试使用示例代码:

导入“dart:mirrors”;
A类{}
void main(){
var string=“str”;
var布尔值=真;
var整数=5;
var-map={};
var列表=[];
var custom=newa();
var strRunT=string.runtimeType;
var strRefT=reflect(string).type.reflectedType;
var boolRunT=boolean.runtimeType;
var boolRefT=reflect(布尔值).type.reflectedType;
var intRunT=integer.runtimeType;
var intRefT=reflect(整数).type.reflectedType;
var mapRunT=map.runtimeType;
var mapRefT=reflect(map).type.reflectedType;
var listRunT=list.runtimeType;
var listRefT=reflect(list).type.reflectedType;
var cusRunT=custom.runtimeType;
var cusRefT=reflect(自定义).type.reflectedType;
打印('字符串');
打印('runtimeType=$strRunT');
打印('reflectedType=$strRefT');
打印('runT==refT=${strRunT==strRefT}');
打印('runT==String=${strunt==String}');
打印('refT==String=${streft==String}');
打印(“”);
打印(“bool”);
打印('runtimeType=$boolRunT');
打印('reflectedType=$boolRefT');
打印('runT==refT=${boolRunT==boolRefT}');
打印('runT==bool=${boolRunT==bool}');
打印('refT==bool=${boolRefT==bool}');
打印(“”);
打印(‘整数’);
打印('runtimeType=$intRunT');
打印('reflectedType=$intRefT');
打印('runT==refT=${intRunT==intRefT}');
打印('runT==int=${intRunT==int}');
打印('refT==int=${intRefT==int}');
打印(“”);
打印(“地图”);
打印('runtimeType=$mapRunT');
打印('reflectedType=$mapRefT');
打印('runT==refT=${mapRunT==mapRefT}');
打印('runT==Map=${mapRunT==Map}');
打印('refT==Map=${mapRefT==Map}');
打印(“”);
打印(“列表”);
打印('runtimeType=$listRunT');
打印('reflectedType=$listRefT');
打印('runT==refT=${listRunT==listRefT}');
打印('runT==List=${listRunT==List}');
打印('refT==List=${listRefT==List}');
打印(“”);
打印(“自定义”);
打印('runtimeType=$cusRunT');
打印('reflectedType=$cusRefT');
打印('runT==refT=${cusRunT==cusRefT}');
打印('runT==A=${cusRunT==A}');
打印('refT==A=${cusRefT==A}');
打印(“”);
}
//输出
一串
runtimeType=String
reflectedType=字符串
runT==refT=false
runT==String=true
refT==String=false
布尔
runtimeType=bool
反射类型=布尔
runT==refT=true
runT==bool=true
refT==bool=true
整数
runtimeType=int
reflectedType=int
runT==refT=false
runT==int=true
refT==int=false
地图
runtimeType=\u LinkedHashMap
reflectedType=\u LinkedHashMap
runT==refT=true
runT==Map=false
refT==Map=false
列表
runtimeType=List
reflectedType=列表
runT==refT=true
runT==List=false
refT==List=false
习俗
runtimeType=A
反射类型=A
runT==refT=true
runT==A=true
refT==A=true

另外,是否有比较2
类型
s并找出它们是否相等的方法?如上例所示,使用常规的
=
运算符时,
int
的两个独立类型并不相等。

当类重写
runtimeType
成员时,将得到不同的结果。基本上,对象可以位于其类型上


您可以在线程中阅读更多内容:。

Alexandre所说的字符串类型示例。在dart:core中,字符串类重写runtimeType以始终返回基类类型字符串。但是,在VM中,字符串有许多不同的运行时子类型。i、 e单字符字符串、ascii字符串、utf8字符串。镜像api返回实际的底层子类型

关于这个问题,请参见Gilad(API的设计者)

“是否有必要比较两种类型并找出它们是否相等?”

有三种新方法允许您在使用镜像时比较类型:TypeMirror.isSubtypeOf、TypeMirror.isAssignableTo、ClassMirror.isSubclassOf