这种行为似乎与“延伸”的存在有关,如下面的单元测试所示:
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
});
}
答案 0 :(得分:2)
VM挂起的事实显然是一个错误。代码是合法的。 typedef描述函数类型并且可以是通用的,而函数类型本身从不是通用的这一事实原则上不是问题(尽管可能是为了实现)。
答案 1 :(得分:1)
我觉得非常有趣的是,typedef中的类型参数在没有某种警告或错误的情况下工作,因为Dart没有泛型方法。
你很可能在这里遇到两个错误,第一个没有错误,第二个是VM挂起。