【问题标题】:Using Dart's call() method with generics使用带有泛型的 Dart 的 call() 方法
【发布时间】: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&lt;String&gt; stringFoo = (String input) =&gt; input.trim(); 行将函数分配给类型为 Foo&lt;String&gt; 的静态字段。应该是static final Foo&lt;String&gt; stringFoo = new Foo&lt;String&gt;((String input) =&gt; input.trim());? (不过,它没有解释错误消息)。

标签: generics dart


【解决方案1】:

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

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

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

VM 抛出以下错误:

类型'String'不是't'类型'int'的子类型。

你应该file an issue

【讨论】:

    猜你喜欢
    • 2020-08-30
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2020-06-03
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多