运算符“is”和“TypeMirror.isSubtypeOf”之间的关系

时间:2014-04-09 10:53:49

标签: dart dart-mirrors

根据'dart:mirror'

上的bool isSubtypeOf(TypeMirror other)文档
  /**
   * 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)"上的文档,我认为它应该以{{1​​}}的形式运行。

此代码按预期工作:

"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");
}

但是我无法理解&#34;这个结果是否正确&#34;?

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");
}

2 个答案:

答案 0 :(得分:3)

is运算符在左侧获取一个对象实例,在右侧获取一个类型,并检查该对象是否是该类型的实例(或该类型的任何子类型)。 测试Object is booldynamic is bool都给出了错误,因为您正在测试Type对象是否是bool的实例。如果你写了Object is Type,那就是真的。

isSubtypeOf测试给出了预期的结果:Object不是bool的子类型,dynamic是bool的子类型。动态&#34;类型&#34;根据{{​​1}}关系,它是所有类型的子类型和超类型。

我个人认为<:不是一种类型,而是一种类型的替代品。它是程序员的说法,相信我,我知道我在做什么&#34;,这就是为什么任何涉及动态的测试通常都会说&#34;是&#34;。它代表程序员省略编写的某些类型或类型,但如果它们在那里则完全正确。

关于标题问题,关系是:

dynamic

答案 1 :(得分:1)

对我来说看起来像个错误:

/**
 * Checks the subtype relationship, denoted by [:<::] in the language
 * specification. This is the type relationship used in [:is:] test checks.
 */
bool isSubtypeOf(TypeMirror other);