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

标签 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)"的文档,那么我认为它应该作为"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 booldynamic is bool都给出false,因为您正在测试Type对象是否是bool的实例。如果您编写了Object is Type,那将是正确的。
isSubtypeOf测试给出了预期的结果:对象不是bool的子类型,而dynamic是bool的子类型。根据<:关系,动态“类型”既是所有类型的子类型又是父类(super class)型。

就我个人而言,我不认为dynamic是一种类型,它不像具有类型一样多。这是程序员说“相信我,我知道我在做什么”的方式,这就是为什么任何涉及动态的测试通常都会说"is"的原因。它代表程序员省略写的一种或多种类型,但是如果它们在那里,那将是完全正确的。

至于标题问题,关系为:

(reflect(o).type.isSubtypeOf(reflectType(Foo))) == (o is Foo)

关于dart - 运算符 “is”和 “TypeMirror.isSubtypeOf”之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22960334/

相关文章:

dart - 为 Dart 中的每个发射生成一个带有延迟的流

Dart - 如何根据设备时区格式化 DateTime?

dart - 在 Dart 中,给定一个类型名称,如何获取类型(类)本身?

database - Flutter中的Sqlite,数据库 Assets 如何工作

firebase - 如何使用DocumentSnapshot而不是QuerySnapshot?

Flutter|如何改变AlertDialog里面按钮的颜色?

dart - 如何初始化烟雾

dart - 在Dart中,setter方法生成的名称是什么?

reflection - 反射:LibraryMirror中没有任何功能

dart - 获取具有用 Redstone 的 @Field() 注释的字段的类