考虑以下课程:
@immutable
class Foo<T, R> {
const Foo({
required this.bar,
});
final R Function(T data) bar;
Foo copyWith({
R Function(T data)? bar,
}) {
return Foo(
bar: bar ?? this.bar,
);
}
}
在上面的类中,
bar: bar ?? this.bar
行产生诊断消息:
参数类型“R Function(T)”无法分配给参数 输入“动态函数(动态)”。
如何在不可变泛型类中为泛型函数字段实现
copyWith
方法?
您的问题是您的
copyWith
实现被声明返回 Foo
,但这是 Foo<dynamic, dynamic>
的简写。然后,类型推断自上而下流向返回的表达式,导致 Foo(bar: bar ?? this.bar)
被推断为构造 Foo<dynamic, dynamic>
,而不是构造 Foo<T, R>
(否则会从自下而上的类型推断中发生)。
因此您应该修复返回类型:
Foo<T, R> copyWith({
R Function(T data)? bar,
}) {
return Foo(
bar: bar ?? this.bar,
);
}
请注意,您可以通过执行以下操作强制自下而上推理:
// Probably not what you want!
Foo copyWith({
R Function(T data)? bar,
}) {
var copy = Foo(
bar: bar ?? this.bar,
);
return copy;
}
这也可以避免静态类型错误,但最终会隐式地将
Foo<T, R>
转换为 Foo<dynamic, dynamic>
,这可能不是你想要的。