Generics Dart中具有泛型的扩展方法:类型dynamic can的值';无法从方法返回
鉴于此 列表上的扩展名{ 列表addAtTheEnd(T值){ 返回此.addAllAtTheEnd([value]); } 列表addAllAtTheEnd(列表值){ 返回[ 这 价值观 ]; } } 在代码编辑器中,Generics Dart中具有泛型的扩展方法:类型dynamic can的值';无法从方法返回,generics,dart,extension-methods,Generics,Dart,Extension Methods,鉴于此 列表上的扩展名{ 列表addAtTheEnd(T值){ 返回此.addAllAtTheEnd([value]); } 列表addAllAtTheEnd(列表值){ 返回[ 这 价值观 ]; } } 在代码编辑器中,this.addAllAtTheEnd([value])带下划线,表示: 无法从方法“addAtTheEnd”返回类型为“List”的值,因为它的返回类型为“List”。 这听起来不合逻辑,因为addAllAtTheEnd方法没有编译错误,我在调用站点(addAtTheEnd
this.addAllAtTheEnd([value])
带下划线,表示:
无法从方法“addAtTheEnd”返回类型为“List”的值,因为它的返回类型为“List”。
这听起来不合逻辑,因为addAllAtTheEnd
方法没有编译错误,我在调用站点(addAtTheEnd
)上显式定义了泛型的类型,并使用This
指示调用该方法的类型
为什么这不起作用?我如何才能使它起作用?是的,省略
这个可以解决问题,就像注释中建议的jamesdlin
一样
我彻底测试了它,结果如下:
这包括:
。。。
列表addAtTheEnd(T值){
返回addAllAtTheEnd([value]);
}
这不是而是:
。。。
列表addAtTheEnd(T值){
最终thiz=此;
返回thiz.addAllAtTheEnd([value]);
}
因为它相当于以下内容,其中问题更为明确:
。。。
列表addAtTheEnd(T值){
最终列表thiz=此;
返回thiz.addAllAtTheEnd([value]);
}
但是显式声明类型是有效的:
。。。
列表addAtTheEnd(T值){
最终列表thiz=此;
返回thiz.addAllAtTheEnd([value]);
}
有趣的事实:dart linter
如果启用了该lint规则,则会抱怨解决方案,即
因此,调用this
的正确明确用法如下:
...
List<T> addAtTheEnd(T value) {
// ignore: omit_local_variable_types
final List<T> thiz = this;
return thiz.addAllAtTheEnd([value]);
}
。。。
列表addAtTheEnd(T值){
//忽略:忽略\本地\变量\类型
最终列表thiz=此;
返回thiz.addAllAtTheEnd([value]);
}
如果以以下方式将其用于内联显式转换:
列表addAtTheEnd(T值){
return(作为列表)。addAllAtTheEnd([value]);
}
您会收到一条警告,自动修复会很乐意帮助您将代码转换为不可编译。我不知道为什么dartanalyzer
会抱怨List
,但似乎您可以通过将this.addAllAtTheEnd(…)
更改为addAllAtTheEnd(…)
来修复它。顺便说一句,您可以使用List.append
来添加单个元素,使用+=
来添加另一个List
。我知道append
函数,我的目标是创建一个最小的可复制示例,但感谢您指出它。我会看看它在没有这个
的情况下是否有效。我之所以用这个
来写它,是因为没有它,智能补全就无法工作。你让我开心!非常感谢。