使用Dart的call()方法和泛型

时间:2015-07-06 10:07:20

标签: generics dart

我正在尝试编写一个可以像函数一样调用的类,使用泛型如下:

typedef T FooFunction<T>(T input);

class Foo<T> {
  final FooFunction fooFunction;

  Converter(FooFunction<T> this.fooFunction);

  T call(T input) => this.fooFunction(input);

  static final Foo<String> stringFoo = new Foo<String>((String input) => input.trim());

  static final Foo<int> intFoo = new Foo<int>((int input) => input * -1);
}

我试图这样称呼它:

String bar = Foo.stringFoo('  Hello World     ');
int baz = Foo.intFoo('5');

如果我删除了所有的类型提示,这段代码工作正常,但是在那里有类型提示,分析器抱怨“类型'String'的参数不能分配给参数类型'T'”和那个“ “T”类型的值不能分配给“String”类型的变量。“很明显,这里发生的是分析器在T的定义中看到Foo.call类型并按字面解释它,而不是在泛型类型的上下文中。

如果我将来电更改为以下内容:

String bar = Foo.stringFoo.fooFunction('  Hello World     ');
int baz = Foo.intFoo.fooFunction('5');

为了让他们不再使用call方法,分析师会理解发生的事情。

我是否在宣布call方法方面做错了什么?有没有办法使用call方法,同时保持正确的类型提示和静态分析,就像我直接调用方法一样?或者我做的一切正常,我只需要向Dart开发者提交错误报告吗?

1 个答案:

答案 0 :(得分:1)

它看起来像是分析仪中的一个错误。简单的跟随测试不会从分析仪产生警告或提示(尽管执行失败):

class F<T> {
  T call(T t) => t;
}

main() {
  final f = new F<int>();
  f('Fail');
}

VM抛出以下错误:

  

type&#39; String&#39;不是类型&#39; int&#39;的子类型。 &#39; t&#39;。

你应该file an issue