【发布时间】:2015-09-23 10:26:23
【问题描述】:
我正在尝试编写一个可以像函数一样调用的类,使用这样的泛型:
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' 类型的变量。”很明显,这里发生的事情是分析器在Foo.call 的定义中看到T 类型并按字面意思解释它,而不是在泛型类型的上下文中。
如果我将调用更改为以下内容:
String bar = Foo.stringFoo.fooFunction(' Hello World ');
int baz = Foo.intFoo.fooFunction('5');
这样他们就不再使用call 方法,分析器就可以很好地了解正在发生的事情。
我在声明call 方法的方式上做错了吗?有没有办法使用call 方法,同时保持正确的类型提示和静态分析,就像我直接调用该方法一样?还是我做的一切都正确,我只需要向 Dart 开发人员提交错误报告?
【问题讨论】:
-
我认为代码中存在错误。
static final Foo<String> stringFoo = (String input) => input.trim();行将函数分配给类型为Foo<String>的静态字段。应该是static final Foo<String> stringFoo = new Foo<String>((String input) => input.trim());? (不过,它没有解释错误消息)。