【问题标题】:Extension methods with generics in Dart: Value of type dynamic can't be returned from methodDart 中具有泛型的扩展方法:动态类型的值无法从方法返回
【发布时间】:2020-06-05 05:41:29
【问题描述】:

鉴于此

extension<T> on List<T> {
  List<T> addAtTheEnd(T value) {
    return this.addAllAtTheEnd(<T>[value]);
  }

  List<T> addAllAtTheEnd(List<T> values) {
    return [
      ...this,
      ...values,
    ];
  }
}

在代码编辑器中,this.addAllAtTheEnd(&lt;T&gt;[value]) 带有下划线,表示:

A value of type 'List&lt;dynamic&gt;' can't be returned from method 'addAtTheEnd' because it has a return type of 'List&lt;T&gt;'.

这对我来说听起来不合逻辑,因为 addAllAtTheEnd 方法没有编译错误,我在调用站点 (addAtTheEnd) 上明确定义了泛型类型,并且我使用 this 来指示什么类型我正在调用该方法。

为什么这不起作用,我怎样才能使它起作用?

【问题讨论】:

  • 我不知道为什么dartanalyzer 会抱怨List&lt;dynamic&gt;,但您似乎可以通过将this.addAllAtTheEnd(...) 更改为addAllAtTheEnd(...) 来解决它。顺便说一句,您可以将List&lt;T&gt;.append 用于单个元素,将+= 用于附加另一个List
  • 我知道append 函数,我的目标是创建一个最小的可重现示例,但感谢您指出。
  • 我会看看它是否在没有this 的情况下工作。我之所以使用this 编写它,是因为没有它,智能补全就无法工作。

标签: generics dart extension-methods


【解决方案1】:

是的,省略 this 会解决问题,就像 cmets 中建议的 jamesdlin 一样。


我对它进行了彻底的测试,结果如下:

这样编译:

...
  List<T> addAtTheEnd(T value) {
    return addAllAtTheEnd([value]);
  }

不是

...
  List<T> addAtTheEnd(T value) {
    final thiz = this;
    return thiz.addAllAtTheEnd([value]);
  }

因为它相当于下面的,问题更清楚:

...
  List<T> addAtTheEnd(T value) {
    final List thiz = this;
    return thiz.addAllAtTheEnd([value]);
  }

但显式声明类型有效:

...
  List<T> addAtTheEnd(T value) {
    final List<T> thiz = this;
    return thiz.addAllAtTheEnd([value]);
  }

有趣的事实:如果您启用了 lint 规则,dart linter 会抱怨解决方案,即omit_local_variable_types

因此,调用this 的正确和明确用法如下:

...
  List<T> addAtTheEnd(T value) {
    // ignore: omit_local_variable_types
    final List<T> thiz = this;
    return thiz.addAllAtTheEnd([value]);
  }

如果您通过以下方式使用内联显式强制转换:


  List<T> addAtTheEnd(T value) {
    return (this as List<T>).addAllAtTheEnd([value]);
  }

您收到unnecessary cast 的警告,自动修复很乐意帮助您将代码转换为不可编译。

【讨论】:

  • 男人。你让我今天一整天都感觉很好!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多