我正在尝试编写一个可以像函数一样调用的类,使用泛型如下:
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开发者提交错误报告吗?
答案 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。