0

该行为似乎与“扩展”的存在有关,如下面的单元测试所示:

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

2 回答 2

2

虚拟机挂起的事实显然是一个错误。该代码是合法的。typedef 描述函数类型并且可以是泛型的,而函数类型本身绝不是泛型这一事实原则上不是问题(尽管它可能是用于实现)。

于 2013-03-26T17:43:01.590 回答
1

我发现 typedef 中的类型参数在没有某种警告或错误的情况下工作非常有趣,因为 Dart 没有泛型方法。

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

于 2013-03-26T05:28:04.327 回答