0

以下の単体テストで示されているように、この動作は「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
  });
}
4

2 に答える 2

2

VMがハングするという事実は、明らかにバグです。コードは合法です。typedefが関数型を記述し、ジェネリックである可能性があるのに対し、関数型自体は決してジェネリックではないという事実は、原則として問題ではありません(ただし、実装の場合は問題になる可能性があります)。

于 2013-03-26T17:43:01.590 に答える
1

Dartにはジェネリックメソッドがないため、typedefの型パラメーターがなんらかの警告やエラーなしで機能することは非常に興味深いと思います。

ここで2つのバグに遭遇した可能性があります。1つはエラーがないこと、もう1つはVMがハングすることです。

于 2013-03-26T05:28:04.327 に答える