根据bool isSubtypeOf(TypeMirror other)
上的'dart:mirror'
文档
/**
* Checks the subtype relationship, denoted by [:<::] in the language
* specification. This is the type relationship used in [:is:] test checks.
*/
bool isSubtypeOf(TypeMirror other);
如果我正确理解了"bool isSubtypeOf(TypeMirror other)"
上的文档,那么我认为它应该像"operator is"
一样工作。
此代码按预期工作:
import "dart:mirrors";
void main() {
var objectMirror = reflectType(Object);
var result1 = objectMirror.isSubtypeOf(reflectType(bool));
var result2 = Object is bool;
print("Object is bool: $result1");
print("Object is bool: $result2");
}
输出:
Object is bool: false
Object is bool: false
但我不能理解"这个结果正确与否"?
import "dart:mirrors";
void main() {
var dynamicMirror = reflectType(dynamic);
var result1 = dynamicMirror.isSubtypeOf(reflectType(bool));
var result2 = dynamic is bool;
print("dynamic is bool: $result1");
print("dynamic is bool: $result2");
}
输出:
dynamic is bool: true
dynamic is bool: false
is
操作符在左边取一个对象实例,在右边取一个类型,并检查该对象是否是该类型的实例(或该类型的任何子类型)。测试Object is bool
和dynamic is bool
都给出false,因为您正在测试Type对象是否是bool的实例。如果你写Object is Type
,那是真的。
isSubtypeOf
测试给出了预期的结果:Object不是bool的子类型,dynamic是bool的一个子类型。根据<:
关系,动态"类型"既是所有类型的子类型,也是所有类型的超类型。
就我个人而言,我不认为dynamic
是一种类型,而是一种类型的替代品。这是程序员说"相信我,我知道我在做什么"的方式,这就是为什么任何涉及动态的测试通常都会说"是"。它代表了程序员遗漏编写的一些类型,但如果它们在那里,那将是完全正确的。
关于标题问题,关系是:
(reflect(o).type.isSubtypeOf(reflectType(Foo))) == (o is Foo)
我觉得这是个bug:
/**
* Checks the subtype relationship, denoted by [:<::] in the language
* specification. This is the type relationship used in [:is:] test checks.
*/
bool isSubtypeOf(TypeMirror other);