当使用词法作用域和泛型扩展时,单元测试挂起



该行为似乎与'extends'的存在有关,如下面的单元测试所示:

typedef dynamic GetFromThing<T extends Thing>(T target);
typedef GetFromThing<T> DefGetFromThing<T extends Thing>(dynamic def);
typedef dynamic GetFromT<T>(T target);
typedef GetFromT<T> DefGetFromT<T>(dynamic def);
class Thing {
  int value;
}
class Test {
  static final GetFromThing<Thing> fromThingSimple = (Thing target) {
    return target.value;
   };
  static final DefGetFromThing<Thing> fromThing = (dynamic def) {
    return (target) => null;
  };
  static final DefGetFromT<int> fromInt = (dynamic def) {
    return (target) => null;
  };
}
main() {
  test('this works', () {
    var temp1 = Test.fromThingSimple(new Thing());
  });
  test('this works too', () {
    var temp = Test.fromInt(10);
  });
  test('should let me call lexically closed functions', () {
    var temp = Test.fromThing(10); // <-- causes test to hang
  });
}

虚拟机挂起的事实显然是一个bug。代码是合法的。事实上,类型定义描述函数类型并且可以是泛型的,而函数类型本身从来不是泛型的,这在原则上不是问题(尽管对于实现来说可能是)。

我发现typedefs中的类型参数工作时没有任何警告或错误,这很有趣,因为Dart没有泛型方法。

您很可能在这里遇到两个错误,第一个是没有错误,第二个是VM挂起。

最新更新